2java中equals和-hashCode的关系

27次阅读

共计 789 个字符,预计需要花费 2 分钟才能阅读完成。

equals() 和 ==

java 中的 == 通过对比两个对象是否是同一地址来判断两个对象是否相等。
java 中的 equals() 方法在未被覆写时也是通过比较两个对象是否是同一地址判断两个对象是否相等。
在覆写 equals() 方法后,可以自定义两个对象相等的标准,比如两个 person 类,虽然不是同一个地址,但是 id 相同,也认为他们相等。

equals() 和 hashCode()

在散列表中,通过两个对象的 hashcode 是否相等来判断两个对象是否相同。如果覆写了 equals() 方法但没覆写 hashCode()方法,就会发生这样的情况:
将 person1(id=1001,hashcode = 999)放入散列表。表中不存在这个 hashcode,成功放入。
将 person2(id=1001,hashcode = 998)放入散列表。表中不存在这个 hashcode,成功放入。
person2 和 person1 其实是同一个人,但由于 hashCode 不同,在放入散列表时认为这是两个人,所以两人都成功放入了散列表。
所以在覆写了 equals() 方法时要同时覆写 hashCode()方法,保证用 equals()判断相等的两个对象,用 hashCode 判断也是相等的。

(题外话)对象和对象的地址存在哪?

堆内存用于存放由 new 创建的对象和数组。
栈内存用于存放基本类型变量和对象的引用变量(对象在堆内存中的地址)。

基本类型变量的生命周期:
当变量被定义出来时,为他在栈中分配内存空间。
当超过变量作用域时,为其分配的内存空间被自动释放掉。

堆中对象的生命周期:
当对象被定义出来时,栈中为其定义引用变量,变量的值是对象在堆中内存的首地址。对象本身在堆中分配内存空间。
当超过变量作用域时,栈中为其引用变量分配的内存空间自动释放。堆中占用的内存不会自动释放,当没有引用变量指向它的时候,变成垃圾,由 java 虚拟机自动垃圾回收器来管理。

正文完
 0