目录
1.数据结构:
HashTable:数组加单向链表,新增元素添加在链表头部
// 新增元素
private void addEntry(int hash, K key, V value, int index) {
modCount++;
//数组加链表结构
Entry<?,?> tab[] = table;
......
// 新增元素添加在链表头部
Entry<K,V> e = (Entry<K,V>) tab[index];
tab[index] = new Entry<>(hash, key, value, e);
count++;
}
// 单向链表结构,只有指向next的元素
private static class Entry<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Entry<K,V> next;
ConcurrentHashMap&HashMap:数组加单向链表,新增元素在链表尾部,链表在数量超过8并且当前数组长度大于等于64的时候会转换为红黑树
HashMap 源码 (ConcurrentHashMap 与 HashMap 类似)
// 新增元素
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
......
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
//元素添加在链表尾部
p.next = newNode(hash, key, value, null);
// 链表元素为8个的时候,转换红黑树 TREEIFY_THRESHOLD = 8