1、线程是否安全:HashTable是线程安全的,HashMap是非线程安全的,HashTable内部的方法是被synchronized修饰,如果想要保证线程安全可以使用ConcurrentHashMap!
2、效率:因为非线程安全,HashMap效率要比HashTable效率高,另外HashTable已经被淘汰,项目中尽量避免使用HashTable。
3、对Null Key和Null Value的支持:HashMap中,Null可以作为Key,但是必须唯一,可以有一个或多个key的value为Null,但是在HashTable中put进的键值只要有Null,直接抛出NullPointerException。
4、初始容量和每次扩容大小不同:①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小
5、底层数据结构:JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
HashMap的总体结构
HashMap put方法逻辑图(JDK1.8)