2013-04-04 22 views
-2

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

我知道入门课。

但我知道的ArrayList默认情况下可以用10元开始,或者你可以设置此构造中,如果需要,它被设置更多的元素,将创建另一个数组的值复制...

那么,怎样的HashMap增长?

感谢

回答

2

直从the javadoc

HashMap中的实例具有影响其性能的两个参数:初始容量和负载因子。容量是哈希表中桶的数量,初始容量就是哈希表创建时的容量。加载因子是散列表在其容量自动增加之前被允许获得的满量程的度量。 当哈希表中的条目数超过负载因子和当前容量的乘积时,哈希表会被重新哈希(即重建内部数据结构),以便哈希表具有大约两倍的存储桶数量。

(重点煤矿)

源代码,如果你想要更多的实施细节也与JDK分布。

+0

是的,我明白了,你告诉我,但也有一些是...... 客座率我能确定? 当发生重排时,每个键的哈希码会发生什么? – 2013-04-04 12:09:58

+0

加载因子作为参数传递给构造函数。它默认为0.75。这在javadoc中有记录。你为什么不读它?根据定义,rehash会重新计算哈希值并将每个关键字重新分配给新的存储桶。 – 2013-04-04 12:12:04

+0

我在javadoc阅读了这篇文章,感谢您的帮助@JB Nizet – 2013-04-04 12:13:56

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); 
    } 

}