当前位置: 首页 > news >正文

11. HashSet的内部实现原理是什么?它如何保证元素不重复?

HashSet是Java集合框架中的一个实现了Set接口的类,它用于存储不重复的元素。HashSet的内部实际上是基于HashMap来实现的。下面是HashSet的内部实现原理和它如何保证元素不重复的细节。

1. HashSet的底层数据结构

HashSet内部使用一个HashMap实例来存储元素。在HashSet中,每个添加的元素实际上是作为HashMap中的键存储的,而HashMap中的值是一个常量对象(通常是一个PRESENT对象,它是一个静态的final对象,表示占位符)。

  • HashSet的声明

    public class HashSet<E> implements Set<E>, Cloneable, java.io.Serializable {private transient HashMap<E, Object> map;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
    }

2. 元素添加的过程

当你向HashSet中添加一个元素时,HashSet实际上是将这个元素作为键添加到HashMap中,调用的是HashMapput()方法,并将PRESENT作为值。

  • 添加元素的代码:

    public boolean add(E e) {return map.put(e, PRESENT) == null;
    }
  • 工作流程:

    • 当你调用add(E e)方法时,HashSet会通过e.hashCode()计算哈希值,确定存储位置。

    • 然后,HashMap会检查该位置是否已经存在相同的键(通过equals()方法比较)。

    • 如果该位置没有相同的键,元素将被添加到HashMap中,add()方法返回true

    • 如果该位置已经有相同的键,HashSet不会添加这个元素,add()方法返回false

3. HashSet如何保证元素不重复

HashSet通过HashMap的键来保证元素不重复。HashMap中的键是唯一的,这意味着任何两个键都不能同时存在于HashMap中。HashSet利用这一点,通过以下机制保证元素不重复:

  • hashCode()equals()方法:

    • 当向HashSet中添加元素时,首先会计算元素的哈希码(调用hashCode()方法)。

    • 然后,HashSet会检查是否在相同哈希位置存在相同的对象(调用equals()方法进行比较)。

    • 如果对象的哈希码相同且通过equals()方法被认为是相等的,则该对象被视为重复,不会被添加到集合中。

  • 碰撞处理:

    • 如果两个对象的hashCode()相同但不equals(),它们会存储在HashMap的同一个桶中(链表或树结构中)。

    • HashSet依赖HashMap来管理这些哈希碰撞,并确保即使在这种情况下,也不会有重复的元素被添加。

示例代码:HashSet工作原理的演示

import java.util.HashSet;
​
public class HashSetExample {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("apple");set.add("banana");set.add("apple");  // 重复元素,添加失败
​System.out.println(set);  // 输出: [banana, apple]}
}

在这个示例中,HashSet只存储唯一的元素,因为第二次尝试添加"apple"时,它通过hashCode()equals()方法检测到该元素已经存在于集合中,因此不会再次添加。

总结

  • 内部实现: HashSet是基于HashMap实现的,其中元素作为HashMap的键存储,值是一个常量对象。

  • 元素不重复的保证: 通过hashCode()equals()方法的结合,HashSet确保每个元素的唯一性。如果一个元素已经存在,它不会被再次添加到集合中。

  • 效率: 由于HashSet依赖于哈希表结构,通常在O(1)时间内完成添加、删除和查找操作,这使得它在处理大量数据时非常高效。

理解HashSet的工作原理可以帮助开发者更好地利用这个集合类,尤其是在需要存储不重复元素时。


http://www.mrgr.cn/news/11829.html

相关文章:

  • SSRF漏洞——pikachu
  • Excel中使用VBS自定义函数将中文转为拼音首字母
  • 浙商之源——龙游商帮丨龙游商帮的具象文化符号之建筑篇
  • QtWebEngineView加载本地网页
  • Linux项目自动化构建工具-make/Makefile
  • Java共享内容通信 VS Golang通信共享内存
  • 数据结构---顺序表---单链表
  • 93.WEB渗透测试-信息收集-Google语法(7)
  • 小琳AI课堂:生成对抗网络(GANs)
  • Spring security 密码加密使用
  • 数据结构-递归算法-第四天
  • 苹果发布iOS 18 Beta 7更新:RC准正式版正在路上
  • 论文《Graph Structural Attack by Perturbing Spectral Distance》笔记
  • ReadAgent,一款具有要点记忆的人工智能阅读代理
  • 云知声多模态模型:实时多模态输入输出;独立于 Siri ,苹果或开发新 AI 用于机器人丨 RTE 开发者日报
  • 《黑神话·悟空》的编程语言探讨
  • Ant Design Vue修改表格样式
  • SpringMVC关于参数问题案例
  • MATLAB绘图基础1:MATLAB基础回顾
  • 金融系统中Java如何处理大量的交易和请求