文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

详细解读 Java 中的 HashSet

2024-11-29 20:22

关注

Java中的HashSet

Java中的HashSet是Java集合框架(Java Collections Framework)的一部分,它实现了Set接口。HashSet存储的元素是不重复的,并且它不保证集合的迭代顺序。HashSet允许存储null元素,但最多只能有一个null元素,因为集合中的元素是根据它们的hashCode()方法的返回值来存储的,并且如果两个元素的hashCode()值相同,那么它们的equals()方法也会被调用以确定它们是否相等。

至于内部实现,我们来看一下:

HashSet实际上是基于HashMap实现的,它使用HashMap来存储元素。HashSet中的每个元素都存储为HashMap中的一个键(key),而对应的值(value)则是一个固定的对象(在Java 8及更高版本中,这个对象是一个名为PRESENT的静态常量,而在Java 7及更早版本中,它通常是一个Object类型的空值,如null或新创建的Object()实例)。

HashSet的源码分析

继承与实现

HashSet类继承自AbstractSet类,并实现了Set、Cloneable和java.io.Serializable接口。这意味着HashSet是一个集合,支持克隆和序列化。

public class HashSet  
    extends AbstractSet  
    implements Set, Cloneable, java.io.Serializable

重要属性

HashSet中最重要的属性是一个HashMap,用于存储HashSet中的元素。HashMap的键是HashSet中的元素,而所有的键都映射到同一个虚拟的值(PRESENT),这个值是一个静态常量,用于占位。

// 使用HashMap来存储HashSet的元素  
private transient HashMap map;  
// HashMap中所有键对应的虚拟值  
private static final Object PRESENT = new Object();

构造方法

HashSet提供了多种构造方法,包括无参构造、带初始容量的构造、带初始容量和加载因子的构造,以及通过现有集合构造的构造方法。

主要方法

扩容机制

当HashMap中的元素数量超过其容量和加载因子的乘积时(即达到阈值),HashMap会进行扩容。扩容操作会创建一个新的数组,并将旧数组中的元素重新计算哈希值后存储到新数组中。HashSet的扩容机制依赖于其内部HashMap的扩容机制。

HashSet的存储机制

基于哈希表:HashSet 内部维护了一个哈希表(HashMap 的实例),用于存储集合中的元素。在 HashSet 中,每个元素实际上都作为 HashMap 的一个键(key)存储,而对应的值(value)则是一个固定的对象(在 Java 8 及以后版本中,这个固定对象是一个 PRESENT 常量,它是一个 Object 类型的静态常量,作为 HashMap 的值存在)。

哈希冲突:由于哈希表的大小是有限的,多个键可能通过哈希函数映射到哈希表的同一个位置,这种现象称为哈希冲突。HashSet(通过其内部的 HashMap)使用链表或红黑树(在 Java 8 及更高版本中,当链表长度超过一定阈值时,链表会转换为红黑树以提高查找效率)来解决哈希冲突。

自定义对象的处理

当在HashSet中存储自定义对象时,需要重写这些对象的hashCode()和equals()方法。这是因为HashSet(通过其内部的HashMap)使用这两个方法来检查元素的相等性和确定元素的哈希码。如果这两个方法没有被正确重写,那么HashSet可能无法正确地存储和比较自定义对象。

线程安全

HashSet不是线程安全的。如果在多线程环境下使用,需要外部同步或使用其他并发集合,如ConcurrentHashMap的键集合视图(尽管这不是HashSet,但提供了一种线程安全的集合实现方式)。然而,Java还提供了Collections.synchronizedSet方法来将任何Set包装成一个线程安全的Set,但这通常不是最高效的并发解决方案。

HashSet和HashMap的对比

存储方式不同:

实现接口不同:

存储特性:

不允许存储重复的元素。

不保证元素的迭代顺序。

允许使用null元素。

键(Key)是唯一的,值(Value)可以重复。

允许使用null键和null值(但最多只能有一个null键)。

提供了基于键的快速查找、插入和删除操作。

底层数据结构:

来源:Java极客技术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯