1.list
a.ArrayList 底层实现数据结构是可变数组,默认容量10,扩增1.5倍 线程不安全
int newCapacity = oldCapacity + (oldCapacity >> 1);//新容量,扩容1.5倍,自查>>位运算
b.LinkedList 底层实现原理链表 线程不安全
c.Vector 线程安全 默认容量10 capacityIncrement扩增参数
扩增2倍
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);
2.set
a.hashset 底层实现 hashmap 实现 默认大小16 增长因子0.75
源码底层实现
public HashSet() {
map = new HashMap<>();
}
add操作
private static final Object PRESENT = new Object();常量
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
3.map
数组+链表
hashmap 链表长度>8转换为红黑树(二叉树平衡) 底层实现 hashmap 实现 默认大小16 增长因子0.75
hashmap 可以key,value为null (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
hash冲突
开放定址法:一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。没有空的位置就会进行扩容。
链地址法:
将所有关键字为同义词的记录存储在一个单链表中,一旦发生冲突,在当前位置给单链表增加结点就行。
缺点:查找时需要遍历单链表的性能损耗。
1.7链表头部插入
1.8链表尾部插入 链表长度>7转换为红黑树(二叉树平衡) 最短路径*2>=最长路径 平衡破坏
hashtable 不可以为null 底层实现为null抛出异常 11容量
int newCapacity = (oldCapacity << 1) +1;
为什么线程安全 synchronized关键字修饰
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}