关于HashCode的官方文档定义
支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。
hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用
hashCode
方法时,必须一致地返回相同的整数,前提是对象上equals
比较中所用的信息没有被修改。如果多次执行同一个应用时,不要求该整数必须相同。 如果根据equals(Object)
方法,两个对象是相等的,那么在两个对象中的每个对象上调用hashCode
方法都必须生成相同的整数结果。 以下情况不是必需的:如果根据equals(java.lang.Object)
方法,两个对象不相等,那么在两个对象中的任一对象上调用hashCode
方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。 实际上,由Object
类定义的hashCode
方法确实会针对不同的对象返回不同的整数。 (这一般是通过将该对象的内部地址转换成一个整数实现的,但是 JavaTM 编程语言不需要这种实现技巧) 当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
抽出以下几个关键点:
- 未重写
equals(Object)
时,不同对象的hashCode
是不同的 。- [ 未重写
equals
时,默认调用object
的equals
方法,比较两个 对象的引用是否相同 ] - [ 未重写
hashCode
时,默认调用object
的**hashCode**
方法,返回对象在堆内的地址 ]
- [ 未重写
equals(Object)
相等 ,则hashCode
必须相等 。equals(Object)
重写,则hashCode
必须重写 。 [ 保证 规则2 成立 ]- 两个对象的
hashCode
相同,并不一定表示两个对象就相同,即不能保证equals(Object)
相同。
解释为什么先比较HashCode,相等后再比较equals原因
- 规则4:两个对象的
hashCode
相同,不能判定两个对象是相同的,如Set
的唯一性,因此需要equals
判断 - 先比较
hashCode
是因为效率问题,hashCode
计算快O(1)
内计算出,而equals
需要挨个遍历O(n)
解释equals重写后,HashCode必须重写的原因
- 为了使此类情况成立,当
equals
成立后,hashCode
也能得到相同的结果 。确保插入Set
的唯一性 hashcode
存在意义是快速定位到桶处,若桶都找不到,能够判断桶内元素是否相等,无意义 。
==和equals()的区别
本身特质:
==:操作符 equals:方法
适用对象:
==:主要用于八种基本类型之间的比较,也可用于比较对象 equals():对象之间的比较(基本类型的包装器类型,string,自定义的对象等)
比较时区别:
==:比较两个对象是否指向同一个对象,也就是他们指向对象的首地址是否相同 equals():
1. 重写前 :与**==**符号没有区别
1. 重写后 :从而比较对象的内容是否相同