首先看一下这几个类的继承类图
HashMap、LinkedHashMap、HashTable、TreeMap、ConcurrentHashMap对比
1、HashMap

public class HashMap<K, V> 
extends AbstractMap<K, V> implements Map<K, V>, Cloneable, Serializable {
...
}

底层实现是:数组+链表+红黑树
当出现冲突时,将节点放在冲突节点的后面形成链表,当链表的长度超过一定值时,将链表转换为红黑树进行存储。

2、LinkedHashMap

public class LinkedHashMap<K, V> 
extends HashMap<K, V> implements Map<K, V> {
....
}

LinkedHashMap继承自HashMap,所以底层实现是和HashMap是一样的,但是增加了一个链表来保持元素的插入顺序,所以遍历时和插入时的顺序是一样的。代码实现是在Node节点类中添加了before和after两个指针,确保元素的插入顺序。

3、HashTable

public class Hashtable<K, V> 
extends Dictionary<K, V> implements Map<K, V>, Cloneable, Serializable {
.....
}

HashTable继承自Dictionary,实现了Map接口。HashTable不是继承自AbstractMap,这一点要注意。
HashTable和HashMap的区别是HashTable是线程安全的。但是HashTable是对所有字段加锁,所以性能上不是很好。他的改进是ConcurrentHashMap。

4、ConcurrentHashMap

public class ConcurrentHashMap<K, V> 
extends AbstractMap<K, V> implements ConcurrentMap<K, V>, Serializable {
...
}

ConcurrentHashMap也是线程安全的,他是HashTable,改进版,HashTable是对整个表进行加锁,而ConcurrentHashMap是对整个表进行分段,然后对每一段单独加锁,这样就可以多个线程同时更改这张表,提高了性能。

5、TreeMap

public class TreeMap<K, V> 
extends AbstractMap<K, V> implements NavigableMap<K, V>, Cloneable, Serializable {
...
}

TreeMap的底层实现是红黑树,他的主要特点是能够对节点进行排序。

相关文章: