1.HashMap每次扩容是通过左移动运算进行扩容,保证HashMap的size是2的整数次幂。
int oldCap = (oldTab == null) ? 0 : oldTab.length; int oldThr = threshold; int newCap, newThr = 0; if (oldCap > 0) { if (oldCap >= MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE; return oldTab; } else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && oldCap >= DEFAULT_INITIAL_CAPACITY) newThr = oldThr << 1; // double threshold }
2.保证2的整数次幂的原因是,在求地址的时候,可以通过 [(n - 1) & hash] 的方法等效 hash%n,运行速度快很多。
3.HashSet是通过HashMap实现,val部分每次都传入一个同样的Object对象。
4.HashMap put流程,先判断Map是否已经分配过内存给Node数组,然后散列,查找数组中该位置是否存在元素,存在的话比较哈希值,哈希值相同的话就进一步使用equals比较。