java.util.HashMap是很常见的类(5)
}
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);新建一个Entry对象,并放在当前位置的Entry链表的头部,看看下面的 Entry构造函数就知道了,注意红色部分。
Java代码
Entry(int h, K k, V v, Entry<K,V> n) {
value = v;
next = n;
key = k;
hash = h;
}
如何扩容?
        当put一个元素时,如果达到了容量限制,HashMap就会扩容,新的容量永远是原来的2倍。
上面的put方法里有这样的一段:
Java代码  
if (size++ >= threshold)  
            resize(2 * table.length);  
 
这是扩容判断,要注意,并不是数据尺寸达到HashMap的最大容量时才扩容,而是达到 threshold指定的值时就开始扩容, threshold=最大容量*加载因子。 看看resize方法
  
Java代码  
void resize(int newCapacity) {  
      Entry[] oldTable = table;  
      int oldCapacity = oldTable.length;  
      if (oldCapacity == MAXIMUM_CAPACITY) {  
          threshold = Integer.MAX_VALUE;  
          return;  
      }  
  
      Entry[] newTable = new Entry[newCapacity];  
      transfer(newTable);  
      table = newTable;  
      threshold = (int)(newCapacity * loadFactor);  
  }  
 
重点看看红色部分的 transfer方法
  
Java代码  
void transfer(Entry[] newTable) {  
      Entry[] src=\'#\'"  
      int newCapacity = newTable.length;  
      for (int j = 0; j < src.length; j++) {  
          Entry<K,V> e = src[j];  
          if (e != null) {  
              src[j] = null;  
              do {  
                  Entry<K,V> next = e.next;  
                  int i = indexFor(e.hash, newCapacity);  
                  e.next = newTable[i];  
	
- 发表评论
- 
				
- 最新评论 进入详细评论页>>






