1 Star 0 Fork 2

Emotion404 / JavaBooks

forked from 帝八哥 / JavaBooks 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
hashcode、equals.md 3.55 KB
一键复制 编辑 原始数据 按行查看 历史
DreamCats 提交于 2020-08-11 13:02 . hashcode、equals

我感觉这问题被问的频率有点高

面试官:出个题:

Integer a = new Integer(5);
Integer b = new Integer(5);
System.out.println(a == b); // false

我:false,太简单了嘛。 == 比较的是两个对象的地址哦,你看:

它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象:

  • 基本数据类型==比较的是

  • 引用数据类型==比较的是内存地址

你要是:System.out.println(a.equals(b)); \\ false

面试官:那这个呢:

int a = 5;
Integer b = new Integer(5);
System.out.println(a == b); // true

我:你想考我装箱拆箱嘛?其实,b看到了对面那个哥们是基本类型,我也是基本类型包装的呀,我把衣服一脱,那么就是基本类型了,那就是上面的结论了。b拆箱即可。

装箱:自动将基本数据类型转换为包装器类型

拆箱:自动将包装器类型转换为基本数据类型

基本类型有:

  • byte(1字节):Byte
  • short(2字节):Short
  • int(4字节):Integer
  • long(8字节):Long
  • float(4字节):Float
  • double(8字节):Double
  • char(2字节):Character
  • boolean(未知):Boolean

在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法

valueOf:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

intValue:

public int intValue() {
    return value;
}

面试官:聊一下equals

我:equals是顶层父类Object的方法之一

// 你看,object默认调用的== , 你对象如果不重写,可能会发上重大事故
public boolean equals(Object obj) {
    return (this == obj);
}

顺带说一下Object的hashcode方法

// Returns a hash code value for the object.
// 说白了,返回的就是该对象的地址值
public native int hashCode();

Equals的作用也是判断两个对象是否相等。但它一般有两种使用情况:

  • 情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过==比较这两个对象。

  • 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

Integer a = new Integer(5);
Integer b = new Integer(5);
System.out.println(a.equals(b));

可以看一下Integer的equals方法:

// 重写了Object的equals的方法
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        // 比较value
        return value == ((Integer)obj).intValue();
    }
    return false;
}

hashcode的例子:

public static void main(String[] args) {
    Set<Integer> set = new HashSet<>();
    set.add(1);
    set.add(1);
    System.out.println(set.toString());
}

在添加1的时候,先判断hashcode是否相同,如果相同,继续判断equals比较值,这样的好处是,如果hashcode相同就直接返回false了,减少了一次equals的判断,因为通常hashcode的值判断是否相等比较快,而equals相对于hashcode来讲慢一些。所以,如果不重写hashcode,我们看到object的hashcode是对象的内存值,那么set添加1判断的时候,hashcode永远不相等,那么就永远返回false,不管添加1,还是2,都是false。

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/Emotion404/JavaBooks.git
git@gitee.com:Emotion404/JavaBooks.git
Emotion404
JavaBooks
JavaBooks
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891