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 类的介绍。

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

    关注

    13

    文章

    4245

    浏览量

    85623
  • JAVA
    +关注

    关注

    19

    文章

    2954

    浏览量

    104510
  • 数据结构
    +关注

    关注

    3

    文章

    572

    浏览量

    40082
  • JDK
    JDK
    +关注

    关注

    0

    文章

    81

    浏览量

    16571
收藏 人收藏

    评论

    相关推荐

    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

    树莓派如何安装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

    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次下载

    JavaArrays是什么 Arrays常用方法

    了解Arrays的概念 **A****rrays** 位于java.util包下,Arrays是一个操作数组的工具。 Arrays常用方法 Arrays.fill:
    的头像 发表于 02-17 15:11 1014次阅读
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>Arrays<b class='flag-5'>类</b>是什么 Arrays常用方法

    Java时间转换方案

    LocalDate 的过程,我们使用 Date Java 8 新增的 toInstant() 方法进行转换。 当我们转换一个 Instant 对象时,需要使用 ZoneId
    的头像 发表于 10-09 15:48 465次阅读

    JDKjava.util.TreeMap 介绍

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

    JDKjava.util.ArrayList 介绍

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

    JDKjava.lang.Arrays 的源码解析

    日常开发,我们会使用各种工具,利用封装好的轮子,能让我们的开发事半功倍。但是在JDK,有一个特别的工具——
    的头像 发表于 10-11 15:31 567次阅读
    <b class='flag-5'>JDK</b><b class='flag-5'>中</b><b class='flag-5'>java</b>.lang.Arrays <b class='flag-5'>类</b>的源码解析

    JDKjava.lang.String 的源码解析

    1、String 的定义 public final class String implements java.io.Serializable, Comparable, CharSequence
    的头像 发表于 10-13 10:51 450次阅读
    <b class='flag-5'>JDK</b><b class='flag-5'>中</b><b class='flag-5'>java</b>.lang.String <b class='flag-5'>类</b>的源码解析

    javautil包下有哪些

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

    weblogic修改jdk路径

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

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

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