HashMap
- 内部结构:数组、链表、红黑树
- 链树互转条件:长度超8转链转树,小6树转链
- 初始化数组大小默认16,负载因子0.75
- 扩容:原大小*2
- hash函数
static final int hash(object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
- 原理:key的hashcode高低16位异或
- 作用:
1. 保留数据高低位特征,增加随机性,降低散列冲突
2. 降低索引范围,方便与length-1用位运算&来计算数组下标(位运算&比取模%性能好)
- 线程不安全,有覆盖可能:A线程判断节点为空时挂起,B线程写入节点;A恢复后写入节点,将B线程节点覆盖
线程安全的map
- HashTable:操作方法加synchronized,锁住整个数组,粒度较大
- ConcurrentHashMap:分段锁、CAS、volatile、synchronized,仅锁当前节点
有序的map
- LinkedHashMap:单链表存储头尾节点;节点增加before和after属性标识前置和后置节点
- TreeMap:红黑树实现,按key的自然顺序或定义的comprator排序