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);