Java 集合扩容、HashMap

Vector、HashTable线程安全
ArrayList、HashMap线程不安全

1.StringBuffer和StringBuilder初始化默认大小为16个字符
2.HashMap初始大小默认16,加载因子为0.75,自增为2n
3.HashTable初始大小默认11,加载因子为0.75,自增为2n+1
4.ArrayList初始大小默认10,自增为1.5n
5.Vector初始大小默认10,自增为2n

解决哈希冲突的方法:
开放定址法、再散列函数法(再哈希法)、链地址法(拉链法)。

HashMap采用链地址法解决哈希冲突(哈希碰撞:哈希运算得到的存储地址被占用)。

HashMap由数组和单向链表构成。
HashMap的单向链表越少,性能越强。

HashMap:
默认初始容量(DEFAULT_INITIAL_CAPACITY):2^4
默认负载因子(DEFAULT_LOAD_FACTOR):0.75
最大容量(MAXIMUM_CAPACITY):2^30
transient Node<K,V>[] table; // 数组
capacity:容量。数组大小。
    final int capacity() {
        return (table != null) ? table.length :
            (threshold > 0) ? threshold :
            DEFAULT_INITIAL_CAPACITY;
    }
传入capacity时,capacity会转为大于capacity的最近2的幂次数。
size:键值对(Entry)个数
modCount:HashMap被改变次数
threshold:阈值。size大于threshold时扩容(扩大为当前capacity的2倍)。threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);

猜你喜欢

转载自blog.csdn.net/haoranhaoshi/article/details/108600905