码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap源码

时间:2017-04-12 05:07:59      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:hashmap

public V put(K key, V value) {
   if (table == EMPTY_TABLE) {
       inflateTable(threshold);
   }
   if (key == null)
       return putForNullKey(value);
   int hash = hash(key);
   //找下标
   int i = indexFor(hash, table.length);
   for (Entry<K,V> e = table[i]; e != null; e = e.next) {
       Object k;
       //如果该key已经存在,覆盖并返回旧value
       if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
           V oldValue = e.value;
           e.value = value;
           e.recordAccess(this);
           return oldValue;
       }
   }

   modCount++;
   //如果 没有该key,则增加节点
   addEntry(hash, key, value, i);
   return null;
}

void addEntry(int hash, K key, V value, int bucketIndex) {
   //校验map容量,如果size大于阈值,扩容
   if ((size >= threshold) && (null != table[bucketIndex])) {
       //扩容
       resize(2 * table.length);
       hash = (null != key) ? hash(key) : 0;
       bucketIndex = indexFor(hash, table.length);
   }
   //直接创建节点
   createEntry(hash, key, value, bucketIndex);
}

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];
   //rehash,重新放节点
   transfer(newTable, initHashSeedAsNeeded(newCapacity));
   table = newTable;
   threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
}


void transfer(Entry[] newTable, boolean rehash) {
   int newCapacity = newTable.length;
   for (Entry<K,V> e : table) {
       while(null != e) {
           Entry<K,V> next = e.next;//如果并发,此处一线程挂起,会引起节点循环引用,所以hashMap不安全
           if (rehash) {
               e.hash = null == e.key ? 0 : hash(e.key);
           }
           int i = indexFor(e.hash, newCapacity);
           e.next = newTable[i];
           newTable[i] = e;
           e = next;
       }
   }
}


本文出自 “11898338” 博客,谢绝转载!

HashMap源码

标签:hashmap

原文地址:http://11908338.blog.51cto.com/11898338/1914980

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!