-2

昨天在我的课上,我的教授教哈希,我想知道一件事,哈希图如何存储对象?

我知道入门级。

但我知道 arraylist 默认可以从 10 个元素开始,或者您可以在构造函数中设置它,如果需要设置更多元素,将创建另一个数组复制值...

那么,hashmap 是如何增长的呢?

谢谢

4

2 回答 2

2

直接来自javadoc

HashMap 的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数,初始容量只是哈希表创建时的容量。负载因子是哈希表在其容量自动增加之前允许达到的程度的度量。当哈希表中的条目数超过负载因子和当前容量的乘积时,对哈希表进行重新哈希(即重建内部数据结构),使哈希表的桶数大约增加一倍。

(强调我的)

如果您需要更多的实现细节,源代码也随 JDK 一起分发。

于 2013-04-04T11:57:59.340 回答
1

HashMap有一个Entry的内部数组,当没有指定其他大小时,默认为 16。

我做了一小段代码,在这里你可以看到实际的地图大小,以及它的内部数组大小,所以你可以比较。只需更改 for 循环,使其可以随心所欲地增长。

public static void main(String[] args) throws Exception{
    HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();

    for(int i = 0 ; i < 100 ; i++){
        m.put(i, i);
        Field table = m.getClass().getDeclaredField("table");
        table.setAccessible(true);
        int tableLength = ((Entry[])table.get(m)).length;

        System.out.println("Map size: " + m.size());
        System.out.println("Internal table size: " + tableLength);
    }

}
于 2013-04-04T12:05:28.757 回答