昨天在我的课上,我的教授教哈希,我想知道一件事,哈希图如何存储对象?
我知道入门级。
但我知道 arraylist 默认可以从 10 个元素开始,或者您可以在构造函数中设置它,如果需要设置更多元素,将创建另一个数组复制值...
那么,hashmap 是如何增长的呢?
谢谢
昨天在我的课上,我的教授教哈希,我想知道一件事,哈希图如何存储对象?
我知道入门级。
但我知道 arraylist 默认可以从 10 个元素开始,或者您可以在构造函数中设置它,如果需要设置更多元素,将创建另一个数组复制值...
那么,hashmap 是如何增长的呢?
谢谢
直接来自javadoc:
HashMap 的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数,初始容量只是哈希表创建时的容量。负载因子是哈希表在其容量自动增加之前允许达到的程度的度量。当哈希表中的条目数超过负载因子和当前容量的乘积时,对哈希表进行重新哈希(即重建内部数据结构),使哈希表的桶数大约增加一倍。
(强调我的)
如果您需要更多的实现细节,源代码也随 JDK 一起分发。
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);
}
}