跳转至

Java集合框架与泛型:Set集合

概述

在Java编程中,集合框架(Collections Framework)提供了一套用于存储和操作数据的接口和类。Set接口是集合框架中的一个重要组成部分,它代表一个不允许重复元素的集合。Set接口的主要实现类包括HashSetLinkedHashSetTreeSet。本文将详细介绍Set接口及其实现类的使用。

Set接口简介

Set接口继承自Collection接口,它定义了一个不允许包含重复元素的集合。Set接口的主要特点包括:

  • 不允许重复元素Set集合中的元素是唯一的,如果尝试添加重复元素,操作将被忽略。
  • 无序性Set集合中的元素没有特定的顺序(除了TreeSet,它根据元素的自然顺序或自定义比较器进行排序)。
  • 允许包含null元素:大多数Set实现类允许包含一个null元素。

Set接口的主要实现类

1. HashSet

HashSetSet接口的最常用实现类,它基于哈希表实现。HashSet的特点包括:

  • 无序性:元素没有特定的顺序。
  • 允许null元素HashSet允许包含一个null元素。
  • 高效性HashSet的添加、删除和查找操作的时间复杂度为O(1)。

示例1:使用HashSet存储字符串

import java.util.HashSet;
import java.util.Set;

public class HashSetExample {
    public static void main(String[] args) {
        // 创建一个HashSet实例
        Set<String> set = new HashSet<>();

        // 添加元素
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Apple"); // 重复元素,不会被添加

        // 输出集合内容
        System.out.println("Set: " + set); // 输出: Set: [Apple, Banana, Cherry]

        // 检查元素是否存在
        System.out.println("Contains 'Banana': " + set.contains("Banana")); // 输出: true

        // 删除元素
        set.remove("Cherry");
        System.out.println("Set after removal: " + set); // 输出: Set after removal: [Apple, Banana]
    }
}

2. LinkedHashSet

LinkedHashSetHashSet的子类,它在HashSet的基础上维护了一个双向链表,以保持元素的插入顺序。LinkedHashSet的特点包括:

  • 有序性:元素按照插入顺序排列。
  • 允许null元素LinkedHashSet允许包含一个null元素。
  • 高效性LinkedHashSet的添加、删除和查找操作的时间复杂度为O(1)。

示例2:使用LinkedHashSet存储整数

import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetExample {
    public static void main(String[] args) {
        // 创建一个LinkedHashSet实例
        Set<Integer> set = new LinkedHashSet<>();

        // 添加元素
        set.add(10);
        set.add(20);
        set.add(30);
        set.add(10); // 重复元素,不会被添加

        // 输出集合内容
        System.out.println("Set: " + set); // 输出: Set: [10, 20, 30]

        // 检查元素是否存在
        System.out.println("Contains 20: " + set.contains(20)); // 输出: true

        // 删除元素
        set.remove(30);
        System.out.println("Set after removal: " + set); // 输出: Set after removal: [10, 20]
    }
}

3. TreeSet

TreeSet是基于红黑树(Red-Black Tree)实现的Set集合,它根据元素的自然顺序或自定义比较器进行排序。TreeSet的特点包括:

  • 有序性:元素按照自然顺序或自定义顺序排列。
  • 不允许null元素TreeSet不允许包含null元素。
  • 高效性TreeSet的添加、删除和查找操作的时间复杂度为O(log n)。

示例3:使用TreeSet存储字符串

import java.util.Set;
import java.util.TreeSet;

public class TreeSetExample {
    public static void main(String[] args) {
        // 创建一个TreeSet实例
        Set<String> set = new TreeSet<>();

        // 添加元素
        set.add("Orange");
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // 重复元素,不会被添加

        // 输出集合内容
        System.out.println("Set: " + set); // 输出: Set: [Apple, Banana, Orange]

        // 检查元素是否存在
        System.out.println("Contains 'Banana': " + set.contains("Banana")); // 输出: true

        // 删除元素
        set.remove("Orange");
        System.out.println("Set after removal: " + set); // 输出: Set after removal: [Apple, Banana]
    }
}

练习题

练习1:基本操作

  1. 创建一个HashSet,添加5个不同的字符串元素,并打印集合内容。
  2. 尝试添加一个重复元素,观察集合内容是否发生变化。
  3. 删除一个元素,并打印删除后的集合内容。

练习2:LinkedHashSet的有序性

  1. 创建一个LinkedHashSet,添加5个不同的整数元素,并打印集合内容。
  2. 观察元素的顺序是否与插入顺序一致。
  3. 删除一个元素,并打印删除后的集合内容。

练习3:TreeSet的排序

  1. 创建一个TreeSet,添加5个不同的字符串元素,并打印集合内容。
  2. 观察元素是否按照自然顺序排列。
  3. 尝试添加一个null元素,观察是否抛出异常。

总结

  • Set接口Set接口代表一个不允许重复元素的集合,主要实现类包括HashSetLinkedHashSetTreeSet
  • HashSet:基于哈希表实现,元素无序,允许null元素,操作高效。
  • LinkedHashSet:在HashSet的基础上维护插入顺序,元素有序,允许null元素,操作高效。
  • TreeSet:基于红黑树实现,元素有序,不允许null元素,操作时间复杂度为O(log n)。
  • 应用场景:根据具体需求选择合适的Set实现类,如需要快速查找且不关心顺序时使用HashSet,需要保持插入顺序时使用LinkedHashSet,需要排序时使用TreeSet

通过本文的学习,你应该已经掌握了Set接口及其主要实现类的基本用法。接下来,你可以通过练习题进一步巩固所学知识,并在实际项目中灵活运用Set集合。