Map
- HashMap = 哈希表(数组)+链表/红黑树
原理 |
---|
hash= hashCode 高低16位异或 (hashCode是int, 4字节32位) |
寻址:tab[i = (n - 1) & hash] |
default capacity=16 load facotor =0.75 threshold = capacity*factor ; |
size>threshold则resize() ,扩容时会重新计算threshold,扩容 后 newCap=oldCap<<1 (乘2) |
(续) jdk1.7扩容是重新计算hash;jdk1.8是要看看原来的hash值新增的那个bit是1还是0好了,如果是0则索引没变,如果是1则索引变成"原索引*2 |
链表>8尝试进化 树<6退化 |
putVal时先treeifyBin()然后resize() ,treeifyBin()时hash表长度<64时只resize()不树状化。 |
initialCapacity = (预计数量/load facotor)+1 (加1是规避除法的精度损失而造成的扩容操作) |
- LinkedHashMap = HashMap + 双向链表
- Hashtable 约= syncronized + 哈希表+链表 没有进退化
- TreeMap = 红黑树
- HashSet = HashMap
- TreeSet = TreeMap
Collection
- ArrayList = 动态数组 default capacity = 10 扩容大小150%
- LinkedList = 双向链表
- Vector= syncronized + ArrayList
- Stack = Vector .push() .pop() .peek() 查看/偷看栈顶元素