参考网址:https://www.cnblogs.com/zx-bob-123/archive/2017/12/26/8118074.html
这里面介绍的很详细。
1.hashmap,hashtable
都是基于哈希表实现的,每个元素都是一个key--value对,对内部通过单链表解决冲突问题,容量不足时会自动增长,实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。
不过两者继承父类不同,hashmap继承AbstractMap类,hashtable继承Dictionary类。
hashtable中的key value都不允许出现null值,hashmap可以。
hashmap中没有contains方法。
内部实现使用的数组初始化和扩容方式不同
HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
hashmap不同步,线程不安全。hashtable同步,线程安全。
2.hashtable,concurrenthashmap区别
ConcurrentHashMap是线程安全的HashMap的实现。
HashTable里使用的是synchronized关键字,这其实是对对象加锁,锁住的都是对象整体,当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。
ConcurrentHashMap使用了分割,将一个map分成多个小的hashtable,对map的一部分进行上锁。保证同步的同时,有提高了性能。 3.treemap:
是一个有序的key-value集合,它是通过红黑树实现的。
继承于AbstractMap,所以它是一个Map,即一个key-value集合。
实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
TreeMap 实现了Cloneable接口,意味着它能被克隆。
TreeMap 实现了java.io.Serializable接口,意味着它支持序列化。
TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n) 。
另外,TreeMap是非同步的。 它的iterator 方法返回的迭代器是fail-fastl的。