如下结论来源于源码
集合 | HashMap | HashTable | TreeMap | ConcurrentHashMap |
实现 | public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable | public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable | public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable | public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable |
容量 | 负载因子:0.75f 默认:2^4 扩容:2*n 最大:2^30 扩容机制:当容量大于负载数(容量*负载因子),按容量扩展一倍 | 负载因子:0.75f 默认:11 扩容:2*n+1 最大: Integer.MAX_VALUE - 8 扩容机制:当容量大于负载数(容量*负载因子),按容量扩展一倍 | 单个增加减少 | 负载因子:0.75f 默认:2^4 扩容:2*n 最大:2^30 |
键值 | 1,根据hash码分配存储位置,存储前先计算hash码 2,值都可为空,hash码为0 3,键只有一个可以为空, 4,多个键为空的值,会不重写value值 | 键:父类不允许为空 值:当前类实现不允许为空 | 键不允许为空 值可以为空 | 键不允许为空 值不允许为空 |
分配过程 | 1,先计算hash码 2,数量小于等于6个,是单向链表,包含hashcode,key,value, nextnode属性 3,大于6个是红黑树,先根据hash码找目录,再根据key的hash排序插入,包含parent,left,right,pre,red属性 | 重写equals和hashcode方法,按hash码, 锁住方法保证同步 | 插入和获取的时候,根据hashcode的值的key的值的先后顺序获取 | 过程类似hashmap, 不过有cas机制和synchronized来保证数据同步 锁住节点保证同步 |
存取 | hashcode和键都需要对比,重写 | hashcode和键都需要对比,重写 | hashcode和键都需要对比,重写 | hashcode和键都需要对比,重写 |
线程 | 线程不安全 | 有 synchronized 同步代码块,线程安全 | 线程不安全 | 线程安全 |
读取 | 效率较高 | 效率较低 | 效率较高 | 效率较低 |
线程安全: Collections.synchronizedMap(treeTable);
如下线程安全集合类,其本质是在构造对象的时候加了锁和synchronized同步代码块控制。
接口层级图如下
引荐: