[Q&A] == 和 equals 区别
-
== 对于基本数据类型来说,比较的是值;对于引用数据类型来说,比较的是对象的内存地址。 主要判断两个对象是否为同一个对象。
-
equals() 未重写等价于==;重写equals(),则按重写逻辑。主要判断两个对象内容是否相等。
-
==不会NPE,但是equals() 会引起NPE
[Q&A] java对equals()的要求
1. 对称性:如果x.equals(y)返回是"true",那么y.equals(x)也应该返回是"true";
2. 反射性:x.equals(x)必须返回是"true";
3. 类推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也应该返回是"true";
4. 一致性:如果x.equals(y)返回是"true",只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是"true";
5. 非空性:x.equals(null),永远返回是"false";x.equals(和x不同类型的对象)永远返回是"false";
hashCode()介绍
-
hashCode() 返回一个整数,称为对象的散列码(hash code)。散列码用于快速定位对象在散列表中的位置。
哈希表存储的是键值对 (key-value)。散列表的本质是通过数组
实现的,计算key
得到的哈希码
确定了value
在数组中的索引的位置,所以知道了 key 就可以取出来 value。 -
hashCode()
是Object
的方法,所以Java中的任何类有hashCode()
函数。 -
[Q&A] hashCode() 和 equals() 的关系
如两个对象相等(根据 equals() 方法),则它们的散列码必须相同。如果两个对象不相等(根据 equals() 方法),则它们的散列码不一定不同。 -
hashCode() 方法主要用于那些基于散列的数据结构中,比如 HashMap, HashSet, Hashtable 等。
-
在 Java 中,排序通常依赖于 Comparable 的 或 Comparator接口,而不是 hashCode() 或 equals() 方法。
[Q&A] HashSet中已经有1000个元素。当插入第1001个元素时,需要怎么处理?
1) 将第1001个元素逐个的和前面1000个元素进行比较 效率低下!!
2)当把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值,如果没有相同的hashcode,HashSet会视为对象没有重复出现。 如果发现有相同 hashcode 值的对象,这时会调用equals()方法来检查内容是否相同。如果相同,HashSet 不会让其加入。如果不同的话,就会重新散列到其他位置。 这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。