前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【JavaSE专栏51】Java集合类HashSet解析,基于哈希表无序非重元素集合

【JavaSE专栏51】Java集合类HashSet解析,基于哈希表无序非重元素集合

作者头像
Designer 小郑
发布2023-08-02 08:13:30
3300
发布2023-08-02 08:13:30
举报
文章被收录于专栏:跟着小郑学JAVA

作者主页Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向:Vue、SpringBoot、微信小程序

本文讲解了 Java 中集合类 HashSet 的语法、使用说明和应用场景,并给出了样例代码。


一、什么是HashSet

HashSet 是 Java 编程语言中的一个集合类,它实现了 Set 接口,用于存储不重复的元素,并且不保证元素的顺序,HashSet 是基于哈希表实现的,底层使用 HashMap 来存储元素。

HashSet的特点如下

3

点,请同学们认真学习。

  1. 不允许重复元素:HashSet中不能存储重复的元素,如果尝试向 HashSet 中添加重复元素,添加操作将会失败。
  2. 无序性:HashSet 不保证元素的顺序,元素的存储顺序与添加顺序无关。
  3. 允许存储 null 元素:HashSet 可以存储 null 元素,但只能存储一个 null 元素。

HashSet 通过哈希表来实现快速地插入、删除和查找元素。在插入元素时,HashSet 会根据元素的哈希码将元素放置在相应的哈希桶中,通过哈希码和 equals 方法来判断元素是否重复。当需要查找元素时,HashSet 可以根据元素的哈希码快速定位到对应的哈希桶,然后再通过 equals 方法来确定具体的元素。因此,在使用 HashSet 时,需要确保元素类正确重写了 hashCode()equals() 方法,以保证元素的唯一性。

以下是 HashSet 的一些常见用法示例,请同学们在本地中尝试运行。

代码语言:javascript
复制
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
set.add("apple"); // 添加重复元素,操作将失败
System.out.println(set); // 输出:[orange, banana, apple]
System.out.println(set.contains("banana")); // 输出:true
set.remove("orange");
System.out.println(set); // 输出:[banana, apple]

提示:HashSet 是非线程安全的,如果在多线程环境下使用,可能会导致并发修改异常。如果需要在多线程环境下使用,可以考虑使用线程安全的集合类,如 ConcurrentHashSet 或使用同步操作来确保线程安全。

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

二、HashSet类的使用

HashSet 类继承了父类 AbstractSet,并实现了接口 Set,下面是 HashSet 类常用的方法,请同学们认真学习。

2.1 添加元素

代码语言:javascript
复制
boolean add(E element)
boolean addAll(Collection<? extends E> collection)

2.2 删除元素

代码语言:javascript
复制
boolean remove(Object object)
boolean removeAll(Collection<?> collection)
void clear()

2.3 判断元素是否存在

代码语言:javascript
复制
boolean contains(Object object)
boolean containsAll(Collection<?> collection)
boolean isEmpty()

2.4 获取集合大小

代码语言:javascript
复制
int size()

2.5 迭代遍历

代码语言:javascript
复制
Iterator<E> iterator()

2.6 转换为数组

代码语言:javascript
复制
Object[] toArray()
<T> T[] toArray(T[] array)

提示:HashSet 类还可以使用父类 AbstractCollection 和接口 Set 中定义的其他方法。此外 HashSet 类还具有哈希表的特性,可以通过重写元素的 hashCode()equals() 方法来确保元素的唯一性。

下面是一个简单的示例,演示了 HashSet 类的一些常用方法,请同学们认真学习。

代码语言:javascript
复制
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("orange");

        System.out.println(set);  // 输出:[orange, banana, apple]

        set.remove("banana");

        System.out.println(set);  // 输出:[orange, apple]

        System.out.println(set.contains("apple"));  // 输出:true

        System.out.println(set.size());  // 输出:2

        set.clear();

        System.out.println(set);  // 输出:[]
    }
}

以上代码演示了 HashSet 类的一些常见方法的使用方式,同学们可以根据实际需求选择合适的方法进行操作。

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

三、HashSet类的应用场景

HashSet 类在 Java 中有许多实际应用场景,以下是其中一些常见的应用场景,请同学们认真学习。

  1. 去重:由于 HashSet 不允许存储重复元素,它经常被用于去除集合中的重复元素。通过将元素添加到 HashSet 中,重复的元素将会被自动去除。
  2. 查找和判断:HashSet 在查找和判断元素是否存在时具有高效性能。由于 HashSet 使用哈希表实现,在大量数据的情况下,可以快速地进行元素的查找、插入和删除操作。
  3. 缓存:HashSet 可以用作缓存结构。它可以存储已经计算过的结果,当需要再次使用时,可以快速地从 HashSet 中获取,而不需要重新计算。
  4. 去重统计:HashSet 可以用于统计数据中的不重复元素数量。将数据逐个添加到 HashSet 中,最后 HashSet 的大小即为不重复元素的数量。
  5. 判断两个集合是否有交集:通过 HashSet 的 containsAll() 方法,可以判断两个集合是否有交集。如果一个 HashSet 集合调用 containsAll() 方法传入另一个集合作为参数,返回结果为
true

,则表示两个集合有交集。

  1. 过滤和筛选:可以使用 HashSet 来过滤和筛选集合中特定的元素。将需要过滤的元素存储在 HashSet 中,然后遍历待筛选的集合,根据 HashSet 的 contains() 方法来判断元素是否需要筛选。

需要注意的是,HashSet 不保证元素的顺序,且不适合频繁进行插入和删除操作,如果需要有序性或频繁的操作,请考虑使用 LinkedHashSet 或 TreeSet 等其他集合类。

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

四、HashSet面试题

一、HashSet和ArrayList的区别是什么?

HashSet 是基于哈希表实现的集合,不允许重复元素,无序存储。 ArrayList 是基于数组实现的列表,允许重复元素,有序存储。

二、HashSet如何保证元素的唯一性?

HashSet 通过重写元素的 hashCode()equals() 方法来保证元素的唯一性。当两个元素的 hashCode 值相等且 equals 方法返回

true

时,HashSet 会认为它们是同一个元素,不会重复存储。

三、HashSet中的元素是按照什么顺序存储的?

HashSet 中的元素是无序存储的,即元素的顺序是不确定的,HashSet 内部使用哈希表实现,根据元素的 hashCode 在哈希表中存储,不会保留元素的插入顺序。

四、HashSet如何进行迭代遍历?

可以使用迭代器 Iterator 或增强的 for 循环来遍历 HashSet 中的元素。

代码语言:javascript
复制
   HashSet<String> set = new HashSet<>();
   // 添加元素
   set.add("apple");
   set.add("banana");
   set.add("orange");
   
   // 使用Iterator遍历
   Iterator<String> iterator = set.iterator();
   while (iterator.hasNext()) {
       String element = iterator.next();
       System.out.println(element);
   }
   
   // 使用增强的for循环遍历
   for (String element : set) {
       System.out.println(element);
   }

五、HashSet和HashMap有什么区别?

  • HashSet 是基于哈希表实现的集合,存储的是元素对象。
  • HashMap 是基于哈希表实现的键值对映射,存储的是键值对对象。
  • HashSet 使用元素的 hashCode 和 equals 方法来保证元素的唯一性。
  • HashMap 使用键的 hashCode 和 equals 方法来保证键的唯一性,并且可以通过键来获取对应的值。

五、总结

本文讲解了 Java 中集合类 HashSet 的语法、使用说明和应用场景,并给出了样例代码。在下一篇博客中,将讲解 Java 中 TreeSet 类的知识。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是HashSet
  • 二、HashSet类的使用
    • 2.1 添加元素
      • 2.2 删除元素
        • 2.3 判断元素是否存在
          • 2.4 获取集合大小
            • 2.5 迭代遍历
              • 2.6 转换为数组
              • 三、HashSet类的应用场景
              • 四、HashSet面试题
              • 五、总结
              相关产品与服务
              对象存储
              对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档