HashMap 和 Hashtable 的区别

1.线程是否安全方面:
HashMap是线程不安全的,Hashtable是线程安全的。
HashTable 内部的方法基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);

2.效率方面:
HashMap在效率方面是高于Hashtable的,另外Hashtable基本上已经被淘汰,开发中基本不会去使用

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

4.初始容量大小和每次扩充容量大小的不同 :
(1)Hashtable的默认初始化值是11,之后的每一次扩容,都会变为原来的2n+1;而HashMap的默认初始化值是16,每次扩容容量是原来的2倍
(2) 创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小(HashMap 中的 tableSizeFor() 方法保证)。也就是说 HashMap 总是使用2的幂作为哈希表的大小
(3)底层的数据结构的区别
JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。

posted @ 2019-11-20 23:36  Runtimeing  阅读(107)  评论(0编辑  收藏  举报