- 结构:数组+链表,当链表较长时会转成红黑树,链表长度超过阈值8就转红黑树,如果链表上的节点已存在则替换旧值
- 查询和添加速度快
- 空间换时间
- key-value结构
- 加载因子:默认大小0.75
- 初始容量:默认16,最大容量1<<30 2的30次幂
- 阈值threshold:加载因子*初始容量 一旦容量超过这个值就会扩容
- 线程不安全(put元素时存在resize扩容过程)
- 实现线程线程安全
HashMap map =new HashMap();
map.put("HashMap","HashMap实现线程安全");
Map map1 = Collections.synchronizedMap(map);
- hashtable是线程安全的,通过synchronized实现
- hashmap 通过取key得hash值和容量取余而确定存储位置。 hash值=key的hashcode和key的hashcode异或取值
- hash值=(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)
- hash冲突-hash值相同就是hash冲突,hash碰撞
- hashmap允许一次key为null,hashtable不可以
- 如果hashcode相同及存储位置一样通过equals来获取元素value
- ConcurrentHashMap中最小单元就是一个hashtable
- vector和ArrayList
- 不要说vector是线程安全的,要说vector在add的时候使用了同步函数,
方法上加上了synchronized关键字,
ArrayList的add方法是没有加上这个关键字的。
当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍。