面试基础突击-==、equals、compareTo()异同

一、==和equals

1、概述

==和equals()都是用来比较基本数据类型、对象是否相等,返回值均为boolean。
==比较的是引用地址,equals比较的是值。

(1)比较基本数据类型时,因为基本数据类型存储的是值,也就是值比较,两者没什么区别。
(2)但是比较对象时,因为对象基于内存引用,若引用(堆内存地址)相同,即==结果为true。

对象的首地址,是它在内存中存放的起始地址,它后面的地址用来存放它所包含的各个属性的地址,所以内存会用到多个内存块来存放对象的各个参数。
通过这个首地址找到该对象,进而找到对象的各个属性。

==比较对象在内存中的首地址();
hashCode返回对象在JVM中的存储地址;(像String.class、Long.class这样重写了就是另一说了)
equals比较对象,默认也是比较对象在JVM中的地址,跟==一个意思。(像String.class、Long.class这样重写了就是另一说了)


提一句:StringBuffer、StringBuilder没有重写equals()。

2、从数据类型比较两者差异

(1)基本数据类型

只能用==,因为不是对象,没有equals()。

(2)基本数据类型的包装类

==比较地址,equals()比较内容,因为重写了。

(3)String

==比较地址,equals()比较内容,因为重写了。

(4)一般自定义类

==和equals()都是来源Object.class,作用都一样,比较的是地址。

二、compareTo()

主要做字典顺序比较,如果只是比较异同,用equals就可以。
看看源码,这是String是compareTo()

public int compareTo(String anotherString) {        int len1 = value.length;        int len2 = anotherString.value.length;        int lim = Math.min(len1, len2);        char v1[] = value;        char v2[] = anotherString.value;        int k = 0;        while (k < lim) {            char c1 = v1[k];            char c2 = v2[k];            if (c1 != c2) {                return c1 - c2;            }            k++;        }        return len1 - len2;    }

大概说的就是
如果长度一样,返回第一个不同字符的ASCII码差值;
长度不同分为两种情况:
一是字符都一样,也就是一个是abc,另一个是abcdef这样,就会返回长度差异;
二是字符不一样,那就会返回第一个不同字符的ASCII码。


不太好理解的话,看看这个例子:

        String a = "abc";        String b = "abf";        String c = "abebqwer";        String d = "abe";        System.out.println(a.compareTo(b));        System.out.println(b.compareTo(c));        System.out.println(c.compareTo(d));

输出

-315


简单解读一下:
a跟b长度相同,但是第三个字符分别是c和f,c的ASCII码是99,f的ASCII码是102,所以是-3;
b跟c长度不同,且较短长度的b的所有字符,跟c并不完全一致,f的ASCII码是102,e的ASCII码是101,所以是1;
c跟d长度不同,但较短长度的d的所有字符,跟c的开头完全一致,所以就返回两者的长度差,即5。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章