前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解Java HashSet类及其实现原理

深入理解Java HashSet类及其实现原理

原创
作者头像
喵手
发布2023-11-17 11:43:04
3440
发布2023-11-17 11:43:04
举报
文章被收录于专栏:Java进阶实战

哈喽,各位小伙伴们,你们好呀,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

  如下是Java集合体系架构图,近期几期内容都是围绕该体系进行知识讲解,以便于同学们学习Java集合篇知识能够系统化而不零散。

在这里插入图片描述
在这里插入图片描述

前言

  在Java开发中,集合框架是非常重要的一部分,集合框架为Java提供了一种方式来管理和组织数据。其中HashSet是集合框架中的一种重要实现方式,它提供了一种存储集合元素的无序且唯一的方式。

摘要

  本文将介绍HashSet的基本概念,功能特点,使用方法,以及优缺点分析和应用场景案例。通过本文的学习,读者将会具备使用HashSet的能力,同时了解HashSet的优势和限制。

HashSet

简介

  HashSet是Java集合框架中的一种Set接口的实现。与List集合不同,Set集合中没有重复元素,HashSet提供了一种高效的无序存储方式,可以存储不同类型的数据,包括数字,字符串,对象和集合等。

  HashSet使用哈希表作为存储数据的方式,底层实现是HashMap,每个元素在HashSet中都有一个对应的Key和Value。当添加一个元素到HashSet中时,HashSet会根据元素的hashCode()方法值计算出对应的Key,再将元素加入到HashMap中。如果已存在相同Key的元素则会被覆盖,因此HashSet中不会存在重复元素。

  HashSet的基本操作包括添加元素、删除元素、判断元素是否存在、遍历元素等。

源代码解析

以下是HashSet的源代码解析:

代码语言:java
复制
public class HashSet<E> extends AbstractSet<E>
    implements Set<E>, Cloneable, Serializable
{
    // 底层实现为HashMap
    private transient HashMap<E,Object> map;
    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    // 构造函数
    public HashSet() {
        map = new HashMap<>();
    }

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

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

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

    public void clear() {
        map.clear();
    }

    public int size() {
        return map.size();
    }

    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

    public Object clone() {
        try {
            HashSet<E> newSet = (HashSet<E>)super.clone();
            newSet.map = (HashMap<E,Object>)map.clone();
            return newSet;
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e);
        }
    }

    private void writeObject(ObjectOutputStream s)
        throws IOException {
        s.defaultWriteObject();
        s.writeInt(map.capacity());
        s.writeFloat(map.loadFactor());
        s.writeInt(map.size());
        for (E e : map.keySet())
            s.writeObject(e);
    }

    private void readObject(ObjectInputStream s)
        throws IOException, ClassNotFoundException {
        s.defaultReadObject();
        int capacity = s.readInt();
        if (capacity < 0) {
            throw new InvalidObjectException("Illegal capacity: " +
                                               capacity);
        }
        float loadFactor = s.readFloat();
        if (loadFactor <= 0 || Float.isNaN(loadFactor)) {
            throw new InvalidObjectException("Illegal load factor: " +
                                               loadFactor);
        }
        int size = s.readInt();
        if (size < 0) {
            throw new InvalidObjectException("Illegal size: " +
                                               size);
        }
        map = new HashMap<>(capacity, loadFactor);
        for (int i=0; i<size; i++) {
            E e = (E) s.readObject();
            map.put(e, PRESENT);
        }
    }
}

如下是部分源码截图:

在这里插入图片描述
在这里插入图片描述

应用场景案例

HashSet的应用场景比较广泛,例如:

  • 数据去重:通过将数据存储在HashSet中,可以快速去除重复的数据。
  • 缓存管理:可以使用HashSet来存储缓存对象,以提高缓存查找效率。
  • 数据去重:通过将数据存储在HashSet中,可以快速去除重复的数据。

优缺点分析

HashSet的优点有:

  • 存储快速:HashSet使用哈希表作为底层存储结构,可以快速存储和查找元素。
  • 去重:HashSet中不会存在重复元素,可以用于数据去重。
  • 线程不安全:HashSet是线程不安全的,不适合在多线程环境中使用。

HashSet的缺点有:

  • 无序性:HashSet中的元素是无序的,不能按照特定的顺序进行操作。

类代码方法介绍

以下是HashSet类的常用方法介绍:

  • add(E e):将元素添加到HashSet中。
  • remove(Object o):将元素从HashSet中删除。
  • contains(Object o):判断元素是否存在于HashSet中。
  • clear():清空HashSet中的所有元素。
  • size():返回HashSet中元素的数量。
  • iterator():返回一个迭代器,可以遍历HashSet中的所有元素。

测试用例

以下是使用HashSet的测试用例:

测试代码演示

代码语言:java
复制
package com.example.javase.collection;

import java.util.HashSet;

/**
 * @Author ms
 * @Date 2023-10-21 21:05
 */
public class HashSetTest {
    
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        System.out.println(set.add("Hello"));
        System.out.println(set.add("World"));
        System.out.println(set.add("Hello"));
        System.out.println(set.remove("Hello"));
        System.out.println(set.remove("Hello"));
        System.out.println(set.contains("Hello"));
        System.out.println(set.contains("World"));
        set.clear();
        System.out.println(set.size());
        set.add("Hello");
        set.add("World");
        System.out.println(set.size());
        StringBuilder sb = new StringBuilder();
        for (String s : set) {
            sb.append(s);
        }
        System.out.println(sb.toString());
    }
}

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

在这里插入图片描述
在这里插入图片描述

测试代码分析

该代码演示了 HashSet 的基本用法。

  首先在 main 方法中创建一个空的 HashSet 对象 set,并向其中添加两个字符串 "Hello" 和 "World"。添加第一个元素 "Hello" 时返回 true,添加第二个元素 "World" 时返回 true,再添加第一个元素 "Hello" 时返回 false,因为 HashSet 不允许添加重复元素。

  接着,使用 remove 方法尝试删除元素 "Hello",第一次删除成功并返回 true,第二次删除失败并返回 false,因为元素 "Hello" 已经被删除了。

  contains 方法用来判断元素是否存在于 HashSet 中,第一次查询元素 "Hello" 时返回 false,因为元素已经被删除,第二次查询元素 "World" 时返回 true,因为元素仍然存在。

  clear 方法将 HashSet 中的所有元素清空,使其变为空集合,因此调用 set.size() 方法返回 0。

  set.add 方法可以用于添加元素,再次添加元素 "Hello" 和 "World" 之后调用 set.size() 方法返回 2。

  最后使用 for-each 循环遍历 HashSet 中的元素,将每个元素拼接在一起后输出。因为 HashSet 是无序的,因此输出的字符串也是无序的。

全文小结

  本文介绍了HashSet的基本概念,功能特点,使用方法,以及优缺点分析和应用场景案例。HashSet是Java集合框架中的一种重要实现方式,提供了一种高效的无序存储方式,可以用于数据去重、缓存管理等场景。同时,HashSet是线程不安全的,需要注意使用。

总结

  HashSet是Java集合框架中的一种重要实现方式,具有存储快速、去重等优点,同时也存在一些缺点,例如无序性和线程不安全性。在实际的开发中,需要充分考虑应用场景和需求,选择合适的集合实现方式。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!

⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 摘要
  • HashSet
    • 简介
      • 源代码解析
        • 应用场景案例
          • 优缺点分析
            • 类代码方法介绍
              • 测试用例
                • 测试代码演示
                • 测试结果
                • 测试代码分析
              • 全文小结
              • 总结
              • 文末
              相关产品与服务
              数据保险箱
              数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档