HashMap和几种数据结构的比较

本文探讨了HashMap、HashSet、Hashtable和LinkedHashMap这四种数据结构的区别。HashSet基于HashMap实现,不存储重复元素;Hashtable是线程安全的HashMap,不接受null键值;LinkedHashMap提供更高效的查找删除,其内部结构是双向链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1, HashSet

HashSet是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,


transient HashMap<E, HashSet<E>> backingMap; // //存储元素的实体数组

说白了HashSet只是HashMap表中value值为HashSet特定类型的特殊HashMap,就是只有一个key值的HashMap的集合。Set是数学中定义的集合,所以元素无序,并且不能重复添加。

2, Hashtable

查看源码,发现Hashtable几乎和HashMap的实现完全一样,所以直接论述它们不同的地方,

1, 历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Map接口的一个实现.

2,添加元素时, HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行.

3, HashMap是非synchronized,而HashTable是synchronized,这意味着HashTable是线程安全的.所以在不需要同步的情况下应当使用HashMap。

4, HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常.

 

HashMap可以通过下面的语句进行同步:

Map m =Collections.synchronizeMap(hashMap);

并且,现在如果需要同步,可以使用ConcurrentHashMap而不是Hashtable

3, LinkedHashMap

LinkedHashMap继承与HashMap,与HashMap最大不同之处在于,

HashMap中的散列表是一个单向链表,而LinkedHashMap中的散列表是双向链表,因此在散列表元素比较多的情况下, LinkedHashMap查找删除的效率更高。

private static final float LOAD_FACTOR = 0.75f;// 加载因子
transient volatile Node<K,V>[] table;// 数组大小是2的整数次幂



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值