1、Hashtable与HashMap的区别
- 出生的版本不一样,Hashtable出生于Java发布的第一版本JDK1.0,HashMap出生于JDK1.2。
- 都实现了Map、Cloneable、Serializable(JDK1.8)。
- HashMap 继承的是 AbstractMap,并且 AbstractMap 也实现了 Map 接口。Hashtable 继承Dictionary。
- Hashtable是线程安全的,HashMap 是非线程安全的。
- Hashtable 的 key不能为 null,value 也不能为 null。
- HashMap 的 key和value 都可以为 null。在计算 hash 值的时候,有判断,如果 key==null,则其hash=0 ;至于value是否为 null,没有判断过。
- Hashtable直接使用对象的hash值。
- Hashtable、HashMap都使用了Iterator。Hashtable 还使用了Enumeration的方式。
- 默认情况下,初始容量不同,Hashtable的初始长度是11,之后每次扩充容量变为之前的2n+1(n 为上一次的长度)而 HashMap 的初始长度为 16,之后每次扩充变为原来的两倍。Hashtable 是线程安全,推荐使用 HashMap 代替 Hashtable;如果需要线程安全高并发的话,推荐使用 ConcurrentHashMap 代替 Hashtable。
2、HashMap与ConcurrentHashMap的异同
- 都是 key-value 形式的存储数据;
- HashMap 是线程不安全的,ConcurrentHashMap 是 JUC 下的线程安全的;
- HashMap 底层数据结构是数组 + 链表(JDK 1.8 之前)。JDK 1.8 之后是数组 + 链表 + 红黑树。当链表中元素个数达到 8 的时候,链表的查询速度不如红黑树快,链表会转为红黑树,红黑树查询速度快;
- HashMap 初始数组大小为 16(默认),当出现扩容的时候,以 0.75 * 数组大小的方式进行扩容;
- ConcurrentHashMap 在JDK1.8之前是采用分段锁来现实的Segment+HashEntry,Segment数组大小默认是16,2的n次方;JDK1.8 之后,采用Node+CAS+Synchronized来保证并发安全进行实现。
3、红黑树的特点
1、每个节点是黑色或红色的。 2、根节点是黑色。 3、每个叶子节点都是黑色(指向空的叶子节点) 4、如果一个叶子节点是红色,其子节点必须都是黑色的。 5、从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。