首页 > 其他分享 >11. HashSet的内部实现原理是什么?它如何保证元素不重复?

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

时间:2024-08-27 21:51:55浏览次数:13  
标签:11 HashMap HashSet 重复 元素 equals add 添加

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 Map
        private 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的工作原理可以帮助开发者更好地利用这个集合类,尤其是在需要存储不重复元素时。

标签:11,HashMap,HashSet,重复,元素,equals,add,添加
From: https://blog.csdn.net/zhzjn/article/details/141613491

相关文章

  • 分析 HashSet 和 TreeSet 分别如何实现去重的
     分析HashSet和TreeSet分别如何实现去重的: (1)HashSet的去重机制:hashCode()+equals()。底层先通过存入对象,进行运算得到一个hash值,通过hash值得到对应的索引,如果发现table索引所在的位置,没有数据,就直接存放;如果有数据,就进行equals遍历比较,比较后不相同,就加入,否......
  • D11 kubernetes yaml模板与示例
    》 kubernetes资源的创建、更新、删除等操作均可以使用json或者yaml文件进行操作,更新和删除可以依赖之前的文件进行更改。但是资源清单文件就没那么容易了,k8s的配置项实在是太多,稍微不注意就会犯错。要写好一个yaml文件,需要了解yaml文件的语法,需要整我k8s的各种配置。本文按照k8s......
  • 目录PyCharm Community Edition、python3.11、pythonProject之间的关系
    PyCharmCommunityEdition类型:PyCharmCommunityEdition是由JetBrains公司提供的免费、开源的集成开发环境(IDE)。用途:它专门为Python开发设计,提供了代码编辑、运行、调试、测试等功能。特点:包括智能代码补全、代码分析、图形化界面设计、版本控制集成等高级功能。Pyt......
  • 11.网络管理技术
    13-1SNMP管理模型与配置命令3-4分包括大题向右request向左response默认是version1(不设置的话)13-2ICMP报文协议类型13-3windows2003网络管理release释放租约renew续约与本地有关13-4网络攻击与漏洞查询D13-5......
  • Win11如何找回熟悉的开始菜单、任务栏和右键菜单
    背景公司政策满3年可以换新电脑,前段时间申请了下,到手后发现是Win11系统,配置翻倍,欣然接受,把一些常用的软件都安装上,但是,用了一段时间后,发现右键刷新要点击2次,开始菜单找东西也完全靠搜索,任务栏不可定义了,和以前常用的右下角日历小工具不兼容,如果要和这些用惯好多年的操作sayg......
  • Windows 11 24H2更新实测:AMD Zen5、Zen4游戏性能提升最多35%
    在即将推出的Windows1124H2更新正式版中,会包含针对性的分支预测优化,再结合更高权限的隐藏管理员账号,Zen5游戏性能可获得显著提升最多达13%,Zen4、Zen3也能从中获益。HardwareUnboxed实测了还处于内测版的Windows1124H2Build26100,对比现在的23H2Build2263,共有多达40款游戏,分......
  • laravel11+vue编程
    文档视频地址https://www.youtube.com/watch?v=iGnlmxA7oM8&list=PL38wFHH4qYZXCW2rlBLNdHi5cv-v_qlXO视频代码https://github.com/JonVadar/YouTube_videos/tree/main/Webdeveloperpathvideos/laravel_Inertia_VueCSSfile:https://github.com/JonVadar/YouTube_videos......
  • 网站提示500.11 服务器错误:Web 服务器上的应用程序正在关闭怎么办
    当网站提示 500.11InternalServerError 并指出“Web服务器上的应用程序正在关闭”时,这通常意味着应用程序池(ApplicationPool)在IIS(InternetInformationServices)服务器上已停止运行或正在重启过程中。这种情况通常发生在ASP.NET应用程序中。以下是解决 500.11Internal......
  • 用哈希表求解力扣第217题 存在重复元素
    前言记录一下刷题历程力扣第217题存在重复元素两数之和原题目:给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。示例1:输入:nums=[1,2,3,1]输出:true示例2:输入:nums=[1,2,3,4]输出:false示例3:输......
  • 11112222222
    前言AdobeLightroomClassic为您提供强大的一键式工具和高级控件,使您的照片看起来很棒。轻松整理桌面上的所有照片,并以多种方式共享。使用LightroomClassic,您需要具备所有桌面编辑工具,才能充分发挥照片的作用。增强色彩,使沉闷的镜头充满活力,去除分散注意力的物体,并拉直歪斜的镜......