java - 如果所有元素都在同一个存储桶中,为什么会发生调整大小?

标签 java reflection hashmap hashtable

我编写了下面的代码来测试当所有元素都在同一个存储桶中结束时 HashMap 的行为:-

public class DerivedMain {

int data = 10;

@Override
public int hashCode() {
    return data;
}

public static void main(String[] args) {

    HashMap m = new HashMap();
    for(int i=0;i<20;i++) {
        m.put(i, i);
    }

    Field tableField = null;
    try {
        tableField = HashMap.class.getDeclaredField("table");
    } catch (NoSuchFieldException | SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    tableField.setAccessible(true);
    Object[] table = null;
    try {
        table = (Object[]) tableField.get(m);
    } catch (IllegalArgumentException | IllegalAccessException e) 
            {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(table == null ? 0 : table.length);
}

}

我得到以下输出:- 32

为什么即使所有元素都以同一个存储桶结尾,也会发生调整大小?

最佳答案

因为 HashMap 就是这样的作品:

When the number of entries in the hash table exceeds the product of the load factor and the current capacity, the hash table is rehashed.

HashMap 只知道,一旦达到限制,冲突的概率就会变得太高,它必须重新散列以降低该概率并为将来的条目留出空间。它假设 hashCode 的实现良好,并且绝对无法知道冲突是否是由于 hashCode 的糟糕实现而导致的运气不好。

关于java - 如果所有元素都在同一个存储桶中,为什么会发生调整大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56929302/

相关文章:

c# - 在 C#.NET 中动态转换为类型

Java优化,从hashMap中获益?

java - 当我们将 User 对象作为键时,如何从 HashMap 获取值,如下所示

java - Vaadin-双击时取消选择单选按钮

java - 使用 Initcomponents() 中的函数

java - "OutOfMemoryError "的其他原因?

java - 为什么只有使用反射才能使用此 Java 方法?

c# - 动态加载程序集的应用程序配置

java - 如何拆分分隔列表并将值重新组合成 HashMap ?

java - 在 Activity 之间传递 LinkedList