副本第七关:HashMap和HashTable的区别

107 阅读1分钟
  1. 线程安全方面:HashMap是非线程安全的,HashTable是线程安全的;HashTable内部的方法基本都经过synchronized修饰,但是HashTable已经过时了,如果要保证线程安全的话就使用ConcurrentHashMap吧;

  2. 效率方面:因为线程安全的问题,HashMap要比HashTable效率高一点;

  3. 对null key和null value的支持方面:HashMap中,null可以作为key,这样的key只有一个,可以有一个或多个key所对应的value为null。但是在HashTable中,put进的键值只要有一个为null,直接抛出NullPointerException;

  4. 初始容量大小和每次扩充容量大小的不同方面:① 创建时如果不指定容量初始值,HashTable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16,之后每次扩充,容量变为原来的2倍。② 创建时如果指定了容量初始值,那么HashTable会直接使用你给定的大小,而HashMap会将其扩容为2的幂次方大小,也就是说,HashMap总是使用2的幂作为哈希表的大小;

  5. 底层数据结构方面:JDK1.8以后的HashMap在解决Hash冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间,而HashTable没有这样的机制。