HashMap的默认容量和加载因子

我们先看看默认的构造器吧,以下为我本机的JDK6.0的源代码.

    欢迎访问老紫竹的网站(http://www.java2000.net)和我在CSDN的博客(http://blog.csdn.net/java

  1.     
  2.     static final int DEFAULT_INITIAL_CAPACITY 16;

  3.     
  4.     static final float DEFAULT_LOAD_FACTOR 0.75f;

  5.     
  6.     int threshold;

  7.     public HashMap() {
  8.         this.loadFactor DEFAULT_LOAD_FACTOR; 
  9.         threshold (int)(DEFAULT_INITIAL_CAPACITY DEFAULT_LOAD_FACTOR);
  10.         table new Entry[DEFAULT_INITIAL_CAPACITY];
  11.         init();
  12.     }

    欢迎访问老紫竹的网站(http://www.java2000.net)和我在CSDN的博客(http://blog.csdn.net/java

从代码可以看出,默认的容量是16,而 threshold是16*0.75 = 12;
我们来看看增加的部分代码。
  1.     public put(K key, value) {
  2.         // 我们忽略掉这部分的代码,只看我们这里最关心的部分
  3.         addEntry(hash, key, value, i); // 这里增加了一个Entry,我们看看代码
  4.         return null;
  5.     }

  6.     void addEntry(int hash, key, value, int bucketIndex) {
  7.     Entry<K,V> table[bucketIndex];
  8.         table[bucketIndex] new Entry<K,V>(hash, key, value, e);
  9.         if (size++ >= threshold) // 这里是关键,一旦大于等于threshold的数值
  10.             resize(2 table.length); // 将会引起容量2倍的扩大
  11.     }

  12.     void resize(int newCapacity) {
  13.         Entry[] oldTable table;
  14.         int oldCapacity oldTable.length;
  15.         if (oldCapacity == MAXIMUM_CAPACITY) {
  16.             threshold Integer.MAX_VALUE;
  17.             return;
  18.         }

  19.         Entry[] newTable new Entry[newCapacity]; // 新的容器空间
  20.         transfer(newTable); // 复制数据过去
  21.         table newTable;
  22.         threshold (int)(newCapacity loadFactor); // 重新计算threshold的值
  23.     }
好了,我想我们已经清楚大部分了。
其中有一点,起始容量必须是2的幂次,这如何保证呢?我们来看看其构造方法
  1.     public HashMap(int initialCapacity, float loadFactor) {
  2.         // 忽略掉一部分代码....

  3.         // Find power of >= initialCapacity
  4.         // 重新查找不比指定数值大的最大的2的幂次数
  5.         int capacity 1;
  6.         while (capacity initialCapacity)
  7.             capacity <<= 1;
  8.         // 其它的初始化代码 ...
  9.     }
好了,关于起始容量和加载因子的探讨我们就到这里了。我们应该有了一定的了解了。

总结:
    相对准确的估算数据量,将极大的影响HashMap的性能,因为resize是一个重新分配的过程,耗时应该是里面最大的。
    加载因子较小,会有更多的空间空闲,我不知道这个0.75是不是一个折中方案。也许0.9也是一个不错的选择,特别是那些数据量虽然很大,但不是经常变化的地方,比如公司人员,城市列表等相对比较固定的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值