java里equals和hashcode之间什么关系

2024-12-04 00:33:20
推荐回答(2个)
回答1:

这个从头说起:
在JAVA中利用"=="比较变量时,系统使用变量在"栈"中所存的值作为比较的依据。

基本数据类型在"栈"中存的是其内容值,
对象类型在"栈"中存的是地址,这些地址指向"堆"中的对象。
java.lang包中的Object类有public boolean
equals(Object obj)方法,它比较两个对象是否相等。

其它对象的equals方法仅当被比较的两个引用指向的对象内容相同时,对象的equals()方法返回true。
Hash散列算法,先获取key的hashCode值,通过hash算法确定将要存储的空间(bucket)。同理,获取key的hashCode值,通过hash算法确定要检索的空间。调用 equals方法依次和bucket中的Key比较。
key的hashCode()方法的返回值对HashMap存储元素时起着很重要的作用。hashCode()是在Object中定义的,而Object的equals方法等同于==,因此应妥善重写该方法。
重写hashCode方法应注意:与equals方法的一致性,即两个对象equals方法比较结果为true,则hashCode方法返回值应相同。hashCode返回的数值应符合hash算法的要求。
对于一个类如果重写了其equals方法,则必须重新hashCode方法,否则在应用hashmap时会出现各种错误。
在对象没有改变的情况下,多次调用hashCode方法返回值应该是相同数字。

回答2:

两个不同的方法,没有一定的联系,在有些容器里面会同时用到这两个方法。
比如hashMap的put方法,hash值相同同时equals方法判断相同时,会认为是同一值,后值会替换前值,而hash相同equals方法判断不同的值则会以链表的结构存储。(在某些情况下,不同的值通过hash算法,会算出同样的hash值)