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