0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

JDK中java.util.HashSet 类的介绍

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-09 10:50 次阅读

在 JDK1.8 中,HashMap 是由 数组+链表+红黑树构成,相对于早期版本的 JDK HashMap 实现,新增了红黑树作为底层数据结构,在数据量较大且哈希碰撞较多时,能够极大的增加检索的效率。了解 HashMap 的具体实现后,我们再来介绍由 HashMap 作为底层数据结构实现的一种数据结构——HashSet。(如果不了解 HashMap 的实现原理,建议先看看 HashMap,不然直接看 HashSet 是很难看懂的)。

1、HashSet 定义

HashSet 是一个由 HashMap 实现的集合。元素无序且不能重复。

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

图片和前面介绍的大多数集合一样,HashSet 也实现了 Cloneable 接口和 Serializable 接口,分别用来支持克隆以及支持序列化。还实现了 Set 接口,该接口定义了 Set 集合类型的一套规范。

2、字段属性

//HashSet集合中的内容是通过 HashMap 数据结构来存储的
 private transient HashMap< E,Object > map;
 //向HashSet中添加数据,数据在上面的 map 结构是作为 key 存在的,而value统一都是 PRESENT
 private static final Object PRESENT = new Object();

第一个定义一个 HashMap,作为实现 HashSet 的数据结构;第二个 PRESENT 对象,因为前面讲过 HashMap 是作为键值对 key-value 进行存储的,而 HashSet 不是键值对,那么选择 HashMap 作为实现,其原理就是存储在 HashSet 中的数据 作为 Map 的 key,而 Map 的value 统一为 PRESENT(下面介绍具体实现时会了解)。

3、构造函数

①、无参构造

public HashSet() {
         map = new HashMap<  >();
     }

直接 new 一个 HashMap 对象出来,采用无参的 HashMap 构造函数,具有默认初始容量(16)和加载因子(0.75)。

②、指定初始容量

public HashSet(int initialCapacity) {
         map = new HashMap<  >(initialCapacity);
     }

③、指定初始容量和加载因子

public HashSet(int initialCapacity, float loadFactor) {
         map = new HashMap<  >(initialCapacity, loadFactor);
     }

④、构造包含指定集合中的元素

public HashSet(Collection< ? extends E > c) {
         map = new HashMap<  >(Math.max((int) (c.size()/.75f) + 1, 16));
         addAll(c);
     }

集合容量很好理解,这里我介绍一下什么是加载因子。在 HashMap 中,能够存储元素的数量就是:总的容量*加载因子 ,新增一个元素时,如果HashMap集合中的元素大于前面公式计算的结果了,那么就必须要进行扩容操作,从时间和空间考虑,加载因子一般都选默认的0.75。

4、添加元素

public boolean add(E e) {
         return map.put(e, PRESENT)==null;
     }

通过 map.put() 方法来添加元素,在上一篇博客介绍该方法时,说明了该方法如果新插入的key不存在,则返回null,如果新插入的key存在,则返回原key对应的value值(注意新插入的value会覆盖原value值)。

也就是说 HashSet 的 add(E e) 方法,会将 e 作为 key,PRESENT 作为 value 插入到 map 集合中,如果 e 不存在,则插入成功返回 true;如果存在,则返回false。

5、删除元素

public boolean remove(Object o) {
         return map.remove(o)==PRESENT;
     }

调用 HashMap 的remove(Object o) 方法,该方法会首先查找 map 集合中是否存在 o ,如果存在则删除,并返回该值,如果不存在则返回 null。

也就是说 HashSet 的 remove(Object o) 方法,删除成功返回 true,删除的元素不存在会返回 false。

6、查找元素

public boolean contains(Object o) {
         return map.containsKey(o);
     }

调用 HashMap 的 containsKey(Object o) 方法,找到了返回 true,找不到返回 false。

7、遍历元素

HashSet< Integer > set = new HashSet<  >();
set.add(1);
set.add(2);
//增强for循环
for(Integer i : set){
    System.out.println(i);
}
//普通for循环
Iterator< Integer > iterator = set.iterator();
while (iterator.hasNext()){
    System.out.println(iterator.next());
}

8、小结

好了,这就是JDK中java.util.HashSet 类的介绍。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    12

    文章

    3863

    浏览量

    84694
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    103018
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39909
  • JDK
    JDK
    +关注

    关注

    0

    文章

    77

    浏览量

    16490
收藏 人收藏

    评论

    相关推荐

    JDK的安装、环境配置及使用

    ,变量值输入库名C:\jdk1.5\lib\dt.jar;C:\jdk1.5\lib\tools.jar;然后选择确定。再次选择“系统变量”的“新建”,在变量名
    发表于 12-06 00:19

    java jdk安装参考步骤

    1、把jdk-8u5-linux-x64.gz解压,然后把解压的文件夹放到/usr/lib/jvm/下,并重命名为jdk,这个目录可以自定义。2、编辑~/.basrc文件,在文件的末尾追加下面的命令
    发表于 09-25 16:43

    JAVAJDK、J2EE、J2SE、J2ME的概念详解

    DK、J2EE、J2SE、J2ME概念详解将向你详细介绍JDK、J2EE、J2SE、J2ME的概念以及他们的关系区别。JDK,J2EE,J2SE,J2ME的概念区别是什么呢?1.JDK
    发表于 07-10 08:28

    JDK 15安装步骤及新特性

    JDK 15 ,文本块终于转正,暂不再做进一步的更改。  Java 13 之前用法,使用one-dimensional的字符串语法:  String html = “《html》\n
    发表于 12-23 17:36

    树莓派如何安装Java JDK

    。Oracle Java 具有其他一些商业功能,并且许可仅允许非商业用途。下面介绍如何在树莓派的 Raspbian OS 上安装Java(OpenJDK)。  运行以下命令安装最新的 JDK
    发表于 02-02 16:37

    看看基于JDK自带JVM工具的用法

    用到命令,下面围绕一个微服务的启动和运行,来看看基于JDK自带JVM工具的用法;三、命令行工具1、jps命令jps :虚拟机进程状态工具,该命令在Java环境部署和服务启动查看时经常用到,首先在本地
    发表于 11-16 15:30

    毕昇JDK 8 Dynamic CDS 特性介绍

    Dynamic CDS 增加支持的(lambda、匿名),毕昇JDK 8 暂时没有实现。2 特性介绍
    发表于 12-23 16:19

    java jdk6.0官方下载

    java jdk6.0下载如何件: java jdk6.0安装步骤: 第一步 JDK1.6的安装步骤 第一步双击安装文件
    发表于 10-17 11:47 155次下载
    <b class='flag-5'>java</b> <b class='flag-5'>jdk</b>6.0官方下载

    java基础——java.util.ConcurrentModificationException

    本文档内容介绍java基础java.util.ConcurrentModificationException,供参考
    发表于 03-13 11:31 2次下载

    JDKjava.util.TreeMap 类的介绍

    本篇文章给大家介绍基于树实现的数据结构——TreeMap 1、TreeMap 定义 听名字就知道,TreeMap 是由Tree 和 Map 集合有关的,没错,TreeMap 是由红黑树实现的有序
    的头像 发表于 10-10 11:45 287次阅读
    <b class='flag-5'>JDK</b>中<b class='flag-5'>java.util</b>.TreeMap 类的<b class='flag-5'>介绍</b>

    JDKjava.util.ArrayList 类的介绍

    AbstractList E > implements List E >, RandomAccess , Cloneable , java.io.Serializable ①、实现 RandomAccess 接口 这是
    的头像 发表于 10-10 15:51 242次阅读
    <b class='flag-5'>JDK</b>中<b class='flag-5'>java.util</b>.ArrayList 类的<b class='flag-5'>介绍</b>

    JDKjava.lang.Arrays 类的源码解析

    来揭开它神秘的面纱。 java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用。 1、asList
    的头像 发表于 10-11 15:31 350次阅读
    <b class='flag-5'>JDK</b>中<b class='flag-5'>java</b>.lang.Arrays 类的源码解析

    javautil包下有哪些类

    Javautil包下,包含了许多类,用于提供各种常见的实用工具和数据结构。以下是一些常见的类: ArrayList:动态数组,可以根据需要自动调整大小。 LinkedList:双向链表,用于高效
    的头像 发表于 11-22 15:04 573次阅读

    weblogic修改jdk路径

    )路径的情况。本文将详细介绍如何在WebLogic中修改JDK路径。 一、背景介绍 Java Development Kit(JDK)是
    的头像 发表于 12-05 14:46 495次阅读

    OpenHarmony语言基础类库【@ohos.util.HashSet (非线性容器HashSet)】

    HashSet基于[HashMap]实现。在HashSet中,只对value对象进行处理。
    的头像 发表于 04-26 15:13 113次阅读
    OpenHarmony语言基础类库【@ohos.<b class='flag-5'>util.HashSet</b> (非线性容器<b class='flag-5'>HashSet</b>)】