不对,如果两个对象 x 和 y 满足 x.equals(y) == true,表示对象 x
和对象 y
在逻辑上是相等的也表示x与y两空间的内容相同,又因为哈希地址是靠哈希函数(求哈希地址的算法)来决定的,而哈希函数计算需要靠对象的传入来计算他们的哈希地址,所以它们的哈希码 (hash code)应当相同,因为x与y两对象空间中的逻辑与内容都相同。
========================================================================当 x.equals(y) == true
时,这意味着对象 x
和对象 y
在逻辑上认为是相等的。这不仅仅表示它们的引用地址相同,还表示它们的内容、状态、属性等方面都是相同的。
equals()
方法的具体实现取决于对象的类。在默认情况下,equals()
方法继承自 Object
类,它比较的是对象的引用地址是否相同,等效于 x == y
。但是,很多类都对 equals()
方法进行了重写,以实现更具体的逻辑相等性比较。
例如,如果在某个类中重写了 equals()
方法,那么它可以根据自己的需要来比较两个对象的属性或状态是否相同。这样,即使两个对象的引用地址不同,只要它们的逻辑内容相同,equals()
方法就会返回 true
。
总之,x.equals(y) == true
表示对象 x
和对象 y
在逻辑上(按照特定的比较逻辑)是相等的,不仅仅局限于比较它们的引用地址。
========================================================================
Java 对于 eqauls 方法和 hashCode 方法是这样规定的:
(1)如果两个对象相同equals 方法返回 true(同一对象),那么它们的hashCode 值一定要相同;
(2)如果两个对象的 hashCode 相同,它们的内容(逻辑)并不一定相同,因为哈希表中一个地址对应的链表可以放多个结点(对象)【参考链接法】。
在Java中,哈希码(hash code)是由对象的hashCode()方法计算得出的一个整数值,用于在哈希表等数据结构中进行查找和比较的快速操作。
哈希冲突是指不同的输入数据经过哈希函数计算后得到相同的哈希值,造成数据存储的冲突。为了解决哈希冲突,常用的方法有以下几种:
-
链接法(Chaining):使用链表等数据结构来解决冲突。哈希表中的每个槽位(或桶)都维护一个链表,具有相同哈希值的元素被插入到链表中。这样,当哈希冲突发生时,元素可以简单地添加到链表的末尾。在查找元素时,通过遍历链表来找到目标元素。
-
开放地址法(Open Addressing):在哈希表中寻找下一个可用的槽位来解决冲突。当哈希冲突发生时,在哈希表中找到下一个可用的位置来存储冲突的元素。常用的开放地址法有线性探测、二次探测和双重哈希等。
-
再哈希法(Rehashing):当哈希冲突发生时,使用另一个哈希函数重新计算哈希值。如果仍然发生冲突,则继续使用不同的哈希函数,直到找到可用的槽位
当然,你未必要按照要求去做,但是如果你违背了上述原则就会 发现在使用容器时,相同的对象可以出现在 Set 集合中,同时增加新元素的 效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)