目录

一、引言

二、Set接口概述

1.常用方法

2.实现Set的主要类

2.1.HashSet

2.2.LinkedHashSet

2.3.TreeSet

3.实现类对比

三、Set的遍历与去重

 1.Set的三种主要遍历方式

 1.1.增强型for循环

 1.2.使用 Iterator

1.3.JDK8的forEach

2.Set去重方法

四、结语


一、引言

Set是Java集合框架中用于存储唯一元素的核心接口,广泛应用于数据去重、成员检查、数学集合运算等场景。与List和Map不同,Set通过元素的唯一性保证数据不重复,且不维护元素的插入顺序(除非使用特定实现类)。本文将深入剖析HashSet、LinkedHashSet、TreeSet,结合代码示例讲解核心方法、遍历技巧及使用场景,助你全面掌握Set的精髓!

以下是一个展示Java中常用Set集合的思维导图:

二、Set接口概述

Set接口作为Java集合框架的核心组成部分,与List形成鲜明对比,其核心特征在于元素唯一性。与Map接口不同,Set仅存储单一元素而非键值对,但底层实现与Map存在技术同源性。

1.常用方法

add(E e):添加一个元素,若已存在则添加失败
remove(Object o):移除指定元素
contains(Object o):判断是否包含某个元素
size():返回集合大小
isEmpty():判断集合是否为空
clear():清空集合

        Set<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.add("apple"); // 重复元素不会被添加

        System.out.println(set); // 输出:[banana, apple]
        System.out.println(set.contains("apple")); // true
        set.remove("banana");
        System.out.println(set.size()); // 1
2.实现Set的主要类
2.1.HashSet

HashSet是一个底层基于HashMap实现的Set集合,内部维护一个 HashMap<E, Object>,添加的元素作为 HashMap 的 key,value 是一个空对象(PRESENT)。

特点:
插入和查询效率高。
非线程安全。
自动去重。
使用场景:

存储不需要顺序的唯一元素。

快速查找、插入、删除操作。

示例代码

Set<String> set = new HashSet<>();
set.add("c");
set.add("a");
set.add("b");
System.out.println(set); // 输出顺序不确定,如 [a, b, c] 或 [c, a, b]
2.2.LinkedHashSet

LinkedHashSet是一个继承HashSet,底层基于LinkedHashMap实现的Set集合,利用 LinkedHashMap 的双向链表结构保持插入或访问顺序。
特点
保留插入顺序,同时支持高效的增删查。
自动去重。
严格维护FIFO顺序。
使用场景
适用于需要保持插入顺序或访问顺序,同时需要去重功能。

示例代码

Set<String> set = new LinkedHashSet<>();
set.add("c");
set.add("a");
set.add("b");
System.out.println(set); // 输出顺序固定:[c, a, b]
2.3.TreeSet

TreeSet是一个底层基于TreeMap实现的有序集合,存储的元素必须实现 Comparable 接口,或者构造时传入 Comparator(即元素必须可排序

特点:

不允许 null 元素,非线程安全。

自动排序。

插入/删除效率较低。

有丰富的导航和范围查询方法。

使用场景:

需要按键排序存储。

支持范围查询(如获取大于某值的所有元素)。

示例代码:

        TreeSet<Integer> set = new TreeSet<>();
        set.add(10);
        set.add(20);
        set.add(30);
        set.add(40);

        // 获取 [20, 40) 区间内的子集
        System.out.println(set.subSet(20, 40)); // 输出:[20, 30]

        // 获取小于 30 的元素
        System.out.println(set.headSet(30)); // 输出:[10, 20]
        
        // 获取 >= 20 的元素
        System.out.println(set.tailSet(20)); // 输出:[20, 30, 40]

        //返回严格大于给定元素的最小元素
        System.out.println(set.higher(25)); // 输出:30
        System.out.println(set.higher(40)); // 输出:null(没有更大的)
        
        //返回小于等于给定元素的最大元素
        System.out.println(set.floor(25)); // 输出:20
        System.out.println(set.floor(30)); // 输出:30
        
        //返回大于等于给定元素的最小元素
        System.out.println(set.ceiling(25)); // 输出:30
        System.out.println(set.ceiling(30)); // 输出:30

        TreeSet<String> set = new TreeSet<>();
        set.add("apple");
        set.add("banana");
        set.add("cherry");
        //返回集合中最小的元素(第一个) 
        System.out.println(set.first()); // 输出:apple

        //返回集合中最大的元素(最后一个)
        System.out.println(set.last()); // 输出:cherry

3.实现类对比

三、Set的遍历与去重

 1.Set的三种主要遍历方式
 1.1.增强型for循环
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");

for (String s : set) {
    System.out.println(s);
}
 1.2.使用 Iterator
Iterator<String> it = set.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}
1.3.JDK8的forEach
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.forEach(System.out::println);
2.Set去重方法

Set集合存储元素是唯一的,自动去重。

四、结语

Set 是 Java 中用于处理唯一元素集合的核心工具之一。它不仅简化了去重逻辑,还能根据不同的实现类满足顺序、排序等多样化需求。
通过本文的学习,你应该已经掌握了:
Set 接口的基本方法和特点
HashSet、LinkedHashSet、TreeSet 的区别与使用场景
如何选择合适的实现类以应对不同业务需求
希望这篇文章能帮助你更好地理解和应用 Java 中的 Set 集合,提升编程能力!如果你有任何疑问,欢迎随时交流 😊

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐