HashMap和Hashtable的区别

2023-12-13 07:24:27

一、简介

HashMap:

1、HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。

2、HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。

3、HashMap中key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。

4、HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。

Hashtable:

1、Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。

2、Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。

3、Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。

二、分析两者不同

1、继承的父类不同

HashMap继承自AbstractMap类。但二者都实现了Map接口。
Hashtable继承自Dictionary类,Dictionary类是一个已经被废弃的类(见其源码中的注释)。父类都被废弃,自然而然也没人用它的子类Hashtable了。

2、HashMap线程不安全,Hashtable线程是安全的。

3、包含的contains方法不同

HashMap是没有contains方法的,而包括containsValue和containsKey方法;hashtable则保留了contains方法,效果同containsValue,还包括containsValue和containsKey方法。

4、是否允许null值

Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;HashTable键值对都不能为空,否则包空指针异常。

5、计算hash值不同

为了得到元素的位置,首先需要根据元素的 KEY计算出一个hash值,然后再用这个hash值来计算得到最终的位置。

hashmap是通过位运算,hashtable是通过除法

6、扩容方式不同

当容量不足时要进行resize方法,而resize的两个步骤:
①扩容;
②rehash:这里HashMap和HashTable都会会重新计算hash值而这里的计算方式就不同了(看5);
HashMap 哈希扩容必须要求为原容量的2倍,而且一定是2的幂次倍扩容结果,而且每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入;
而Hashtable扩容为原容量2倍加1;
7、解决hash冲突方式不同

出现hash冲突时:

hashmap:

1、如果冲突数量小于8,则是以链表方式解决冲突。

2、而当冲突大于等于8时,就会将冲突的Entry转换为**红黑树进行存储。

3、而又当数量小于6时,则又转化为链表存储。

hashtable:都是以链表方式存储。

文章来源:https://blog.csdn.net/X_islu/article/details/134843485
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。