浪子归家|HashMap源码分析( 二 )

<< 1) < MAXIMUM_CAPACITY// double threshold }else if (oldThr > 0) // initial capacity was placed in thresholdnewCap = oldThr;else {// zero initial threshold signifies using defaultsnewCap = DEFAULT_INITIAL_CAPACITY;newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);}if (newThr == 0) {float ft = (float)newCap * loadFactor;newThr = (newCap < MAXIMUM_CAPACITY}可以看到如果扩容是原容量*2的方式进行扩,当容量>=MAXIMUM_CAPACITY时候停止扩容.
public V get(Object key) {Node e;return (e = getNode(hash(key), key)) == null ? null : e.value;}getNode(Object key)的源码如下:
final Node getNode(int hash, Object key) {Node[] tab; Node first, e; int n; K k;if ((tab = table) != nullif ((e = first.next) != null) {if (first instanceof TreeNode)return ((TreeNode)first).getTreeNode(hash, key);do {if (e.hash == hash} while ((e = e.next) != null);}}return null;}【浪子归家|HashMap源码分析】可以看到HashMap的put和get相关方法没有做任何线程安全处理,所以HashMap是线程不安全的.关于HashMap的数据结构等 , 由于篇幅问题后续再讲.


推荐阅读