• 【Java 基础篇】Java Set 集合详解:轻松管理不重复元素


    在这里插入图片描述

    Java 编程中,集合是一个非常重要的概念,它允许我们有效地存储和管理一组对象。其中之一是 Set 集合,它是一种无序、不重复的数据结构,非常适合用于存储不重复的元素。本篇博客将深入探讨 Java 中的 Set 集合,从基本概念到高级用法,为您呈现全面的信息。

    1. 什么是 Set 集合?

    Set 是 Java 集合框架中的一部分,它代表了一个不重复元素的集合。这意味着 Set 不允许包含重复的元素,每个元素在集合中都是唯一的。Set 集合通常用于存储无序的、不重复的对象,例如一组唯一的整数或字符串。

    2. 创建和初始化 Set 集合

    在 Java 中,可以使用不同的实现类来创建和初始化 Set 集合。以下是一些常见的初始化方式:

    Set<String> set1 = new HashSet<>(); // 使用 HashSet 初始化
    Set<Integer> set2 = new TreeSet<>(); // 使用 TreeSet 初始化
    Set<Double> set3 = new LinkedHashSet<>(); // 使用 LinkedHashSet 初始化
    
    • 1
    • 2
    • 3

    这些初始化方式分别使用了 HashSetTreeSetLinkedHashSet 作为 Set 集合的底层实现。每种实现类都有其特点,稍后我们将详细介绍它们。

    3. 基本操作

    3.1 添加元素

    Set 集合中添加元素非常简单,使用 add 方法即可。这个方法将确保元素不重复。

    Set<String> fruits = new HashSet<>();
    fruits.add("苹果");
    fruits.add("香蕉");
    fruits.add("橙子");
    
    • 1
    • 2
    • 3
    • 4

    3.2 删除元素

    要从 Set 集合中删除元素,可以使用 remove 方法。这将删除指定元素。

    fruits.remove("香蕉");
    
    • 1

    3.3 查询元素

    要查询是否包含某个元素,可以使用 contains 方法。

    boolean hasApple = fruits.contains("苹果");
    
    • 1

    4. 遍历 Set 集合

    遍历 Set 集合通常使用迭代器或增强的 for-each 循环。

    4.1 使用迭代器

    Iterator<String> iterator = fruits.iterator();
    while (iterator.hasNext()) {
        String fruit = iterator.next();
        System.out.println(fruit);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.2 使用增强的 for-each 循环

    for (String fruit : fruits) {
        System.out.println(fruit);
    }
    
    • 1
    • 2
    • 3

    5. Set 集合的实现类

    Java 提供了多种 Set 集合的实现类,每种实现类都有其独特的特点。以下是一些常见的实现类:

    5.1 HashSet

    HashSet 是最常用的 Set 集合实现类之一。它使用哈希表来存储元素,并提供快速的插入、删除和查询操作。但是,它不保证元素的顺序,即元素在 HashSet 中是无序的。

    5.2 TreeSet

    TreeSet 是基于红黑树数据结构实现的 Set 集合。它可以确保元素按照升序或降序排列,并且支持高效的元素检索、插入和删除。因此,如果需要对元素进行排序,可以选择使用 TreeSet

    5.3 LinkedHashSet

    LinkedHashSetHashSet 的一个子类,它在内部使用链表维护元素的顺序。因此,LinkedHashSet 保持了元素插入的顺序,可以按照插入顺序进行遍历。如果需要保持元素的插入顺序,可以选择使用 LinkedHashSet

    6. Set 集合的性能考虑

    在选择使用 Set 集合时,需要考虑性能。以下是一些性能方面的考虑:

    • HashSet 的性能通常比 TreeSetLinkedHashSet 更好,因为它使用哈希表,提供了快速的插入、删除和查询操作。
    • TreeSet 的性能取决于元素的排序顺序,插入和删除操作通常较慢。
    • LinkedHashSet 的性能类似于 HashSet,但它还会维护元素的插入顺序。

    选择适合您需求的实现类是非常重要的,要根据具体场景来决定。

    7. 使用注意事项

    在使用 Set 集合时,需要注意以下事项:

    • Set 不允许重复元素,因此添加重复元素将被忽略。
    • Set 集合通常不保证元素的顺序,如果需要顺序,请考虑使用 LinkedHashSetTreeSet
    • Set 集合不是线程安全的,如果在多线程环境中使用,需要考虑同步操作或使用线程安全的集合实现。

    8. 高级用法

    8.1 Set 集合的操作

    Set 集合支持一系列集合操作,如并集、交集和差集。可以使用 addAllretainAllremoveAll 等方法来执行这些操作。

    Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3));
    Set<Integer> set2 = new HashSet<>(Arrays.asList(2, 3, 4));
    
    // 求并集
    Set<Integer> union = new HashSet<>(set1);
    union.addAll(set2);
    
    // 求交集
    Set<Integer> intersection = new HashSet<>(set1);
    intersection.retainAll(set2);
    
    // 求差集
    Set<Integer> difference = new HashSet<>(set1);
    difference.removeAll(set2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    8.2 Set 集合的转换

    Set 集合可以轻松地与其他集合类型进行转换。例如,将 Set 转换为数组或列表,或者将数组或列表转换为 Set

    Set<String> set = new HashSet<>(Arrays.asList("apple", "banana", "cherry"));
    
    // 将 Set 转换为数组
    String[] array = set.toArray(new String[0]);
    
    // 将 Set 转换为列表
    List<String> list = new ArrayList<>(set);
    
    // 将数组转换为 Set
    Set<Integer> integerSet = new HashSet<>(Arrays.asList(1, 2, 3));
    
    // 将列表转换为 Set
    Set<Double> doubleSet = new HashSet<>(Arrays.asList(1.0, 2.0, 3.0));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    8.3 Set 集合的更多用法

    8.3.1 判断集合是否为空

    可以使用 isEmpty() 方法来检查一个 Set 是否为空。这在需要验证集合是否包含元素时很有用。

    Set<String> set = new HashSet<>();
    boolean isEmpty = set.isEmpty(); // 返回 true,因为集合是空的
    
    • 1
    • 2
    8.3.2 获取集合的大小

    使用 size() 方法可以获取 Set 集合中元素的个数。

    Set<String> set = new HashSet<>();
    int size = set.size(); // 返回 0,因为集合是空的
    
    • 1
    • 2
    8.3.3 将集合转换为不可修改的集合

    有时候,您可能希望将一个可变的 Set 集合转换为不可修改的集合,以避免不小心修改集合。可以使用 Collections.unmodifiableSet() 方法来实现这一目标。

    Set<String> mutableSet = new HashSet<>();
    // 添加元素到可变集合
    Set<String> unmodifiableSet = Collections.unmodifiableSet(mutableSet);
    
    // 尝试修改不可修改的集合将抛出异常
    unmodifiableSet.add("新元素"); // 抛出 UnsupportedOperationException
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    8.3.4 使用 addAll 合并集合

    如果您需要将两个 Set 集合合并成一个,可以使用 addAll 方法。

    Set<String> set1 = new HashSet<>(Arrays.asList("apple", "banana"));
    Set<String> set2 = new HashSet<>(Arrays.asList("banana", "cherry"));
    
    set1.addAll(set2); // 将 set2 中的元素合并到 set1 中
    
    System.out.println(set1); // 输出 [banana, apple, cherry]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    8.3.5 使用 removeAll 删除集合中的元素

    如果您需要从一个 Set 集合中删除另一个集合中的元素,可以使用 removeAll 方法。

    Set<String> set1 = new HashSet<>(Arrays.asList("apple", "banana", "cherry"));
    Set<String> set2 = new HashSet<>(Arrays.asList("banana", "cherry"));
    
    set1.removeAll(set2); // 从 set1 中删除 set2 中的元素
    
    System.out.println(set1); // 输出 [apple]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    8.3.6 使用 retainAll 保留集合中的共同元素

    如果您只想保留两个 Set 集合中共同的元素,可以使用 retainAll 方法。

    Set<String> set1 = new HashSet<>(Arrays.asList("apple", "banana", "cherry"));
    Set<String> set2 = new HashSet<>(Arrays.asList("banana", "cherry", "date"));
    
    set1.retainAll(set2); // 保留 set1 和 set2 中的共同元素
    
    System.out.println(set1); // 输出 [banana, cherry]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    8.3.7 使用 stream() 进行操作

    Java 8 引入的 Stream API 可以让您更方便地对集合进行各种操作,包括过滤、映射、聚合等。

    Set<String> fruits = new HashSet<>(Arrays.asList("apple", "banana", "cherry", "date"));
    
    // 使用 Stream 过滤元素
    Set<String> filteredFruits = fruits.stream()
            .filter(fruit -> fruit.startsWith("a"))
            .collect(Collectors.toSet());
    
    System.out.println(filteredFruits); // 输出 [apple]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    8.3.8 使用 forEach 遍历元素

    Java 8 引入的 forEach 方法可以方便地遍历集合中的元素。

    Set<String> fruits = new HashSet<>(Arrays.asList("apple", "banana", "cherry"));
    
    fruits.forEach(fruit -> {
        System.out.println(fruit); // 分别输出每个水果
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这些高级用法可以帮助您更灵活地使用 Set 集合,根据具体需求选择适当的方法和技巧来处理数据。无论是处理元素的增删改查,还是进行集合操作和转换,Java 的 Set 集合提供了丰富的功能,以满足各种编程需求。

    9. 示例代码

    以下是一些使用 Set 集合的示例代码:

    // 创建一个 HashSet
    Set<String> fruits = new HashSet<>();
    
    // 添加元素
    fruits.add("苹果");
    fruits.add("香蕉");
    fruits.add("橙子");
    
    // 删除元素
    fruits.remove("香蕉");
    
    // 查询元素
    boolean hasApple = fruits.contains("苹果");
    
    // 遍历集合
    for (String fruit : fruits) {
        System.out.println(fruit);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    10. 总结

    Set 集合是 Java 中一种非常有用的数据结构,用于存储不重复的元素。本博客介绍了 Set 集合的基本概念、创建和初始化、基本操作、遍历、不同实现类、性能考虑、使用注意事项、高级用法以及示例代码。希望通过本文的介绍,您对 Set 集合有了更深入的了解,并能够在实际编程中灵活运用。无论是初学者还是有经验的开发者,都可以通过掌握 Set 集合来提高代码的效率和可维护性。

  • 相关阅读:
    美团即时零售的优势不止“快”
    1.AUTOSAR的架构及方法论
    数据库连接池连接超时报错
    前后端分离的增删改查步骤
    [附源码]Python计算机毕业设计Django贷款申请审核管理系统论文
    期末复习-软件体系结构
    河南高考录取统计分析
    缓存相关问题:雪崩、穿透、预热、更新、降级的深度解析
    函数指针解释
    vscode 远程开发golang
  • 原文地址:https://blog.csdn.net/qq_21484461/article/details/132795997