java - 为什么 Java 对 Set 和 ArrayList 实现不同的 hashcode 方法?

标签 java hashcode

 // this is the hashCode method of Set
public int hashCode() {
    int h = 0;
    Iterator<E> i = iterator();
    while (i.hasNext()) {
        E obj = i.next();
        if (obj != null)
            h += obj.hashCode();
    }
    return h;
}



//this is the hashCode method of List
public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}

为什么 java 使用这两种不同的方法? Set和List的特性有什么关系吗? 为什么它使用 31 而不是其他数字? 谢谢!

最佳答案

集合是无序的,因此 {a, b, c} 必须与 {c, b, a} 具有相同的哈希码。加法是可交换的,因此添加元素的 hashCodes 可以得到该属性。

列表是有序的,因此虽然 [a, b, c] 可能 具有与 [c, b, a] 相同的哈希码,它不需要——如果不这样做会更好,因为尽可能多的不相等的对象应该尝试具有不相等的 hashCode。 ArrayList.hashCode 实现具有该属性。

请注意,Set 和 List 都定义了实现必须如何定义 equalshashCode(Set.hashCodeList.hashCode),因此这些各自的任何(兼容)实现集合看起来几乎一样。这为您提供了一个有用的属性,即包含相同元素的 Set 与任何其他 Set 相等(因此具有相同的 hashCode),而不管底层实现如何。

关于java - 为什么 Java 对 Set 和 ArrayList 实现不同的 hashcode 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41111868/

相关文章:

java - 在 webview 中打开 Firebase 存储 pdf url

java - 在java中解析一个非xml文件

java - 如何在模拟器上使用appium自动化Android手机后退按钮

java - 如何在另一个 recyclerView 中添加一个 recyclerView

java - 为什么每次添加新元素时 ArrayList 的 hashCode() 都会发生变化?

java - hashmap 中的 bucket 到底是什么?

java - 创建 JSONArray 时出现 NullPointerException

java - 为 Set<Integer> 的类似 BitSet 的实现有效地计算 hashCode

java - 理解 HashMap 中 equals 和 hashCode 的工作原理

java - 从 Java 的 HashCode 中获取值