相同点
实现接口
Hashtable、HashMap、TreeMap 三个类均实现Map接口。
存储内容
Hashtable、HashMap、TreeMap 三个类均存储Key、Val键值对。键不可重复,且键只能对应一个Val信息。
不同点
存储特性
HashTable
对应存储(Key、Val)不允许为空。如下图所示:HashMap
对应存储(Key、Val)允许为空,Key有且只能有一个null,Val不限定null的数量。当key重复后,后面存储的键值对就会替换之前的键值对。如下图所示:TreeMap
对应存储(Key、Val)时,Key不允许为空。如下图所示:顺序特性
HashTable 、HashMap
对应存储的(Key、Val)是无序存储。如下图所示:TreeMap
对应存储的(Key、Val)是有序存储,因为TreeMap实现SortedMap接口,默认为生序排序,且内部实现排序为红黑树排序。(红黑树排序为树中任何一个节点均比左子树中所有节点都大于或等于,均比右子树中所有节点都小于或等于)。如下图所示:初始化、增长方式
HashTable
初始化时,若没有指定大小,默认存储空间为11。(JDK源代码)如下图所示:HashMap
初始化时,若没有指定大小,默认存储空间为16。(JDK源代码)如下图所示:线程安全性
HashTable
HashTable类中函数均为同步函数,在函数前增加(synchronized关键字),因此保证了线程安全性。但是在多线程下,处理效率表现低下。当一个线程进行put操作时,其他线程就算是get操作,也需要等待锁释放后才可以进行操作。(不推荐在程序中使用)HashMap
HashMap类中函数均为非同步函数,在同一时刻可以由多个线程同时进行写操作,因此不能保证了线程安全性。如果需要同步,推荐使用ConcurrentHashMap,此类中函数支持同步。与HashTable区别在于,HashTable锁是对象级别,而ConcurrentHashMap是分段锁,当一个线程进行写操作时,其他线程可以读取其他段上数据信息。ConcurrentHashMap不仅保证了多线程的安全性,而且从效率上也有很明显的提升。(推荐在程序中使用)