Java集合框架与泛型:Set集合¶
概述¶
在Java编程中,集合框架(Collections Framework)提供了一套用于存储和操作数据的接口和类。Set
接口是集合框架中的一个重要组成部分,它代表一个不允许重复元素的集合。Set
接口的主要实现类包括HashSet
、LinkedHashSet
和TreeSet
。本文将详细介绍Set
接口及其实现类的使用。
Set接口简介¶
Set
接口继承自Collection
接口,它定义了一个不允许包含重复元素的集合。Set
接口的主要特点包括:
- 不允许重复元素:
Set
集合中的元素是唯一的,如果尝试添加重复元素,操作将被忽略。 - 无序性:
Set
集合中的元素没有特定的顺序(除了TreeSet
,它根据元素的自然顺序或自定义比较器进行排序)。 - 允许包含
null
元素:大多数Set
实现类允许包含一个null
元素。
Set接口的主要实现类¶
1. HashSet¶
HashSet
是Set
接口的最常用实现类,它基于哈希表实现。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¶
LinkedHashSet
是HashSet
的子类,它在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:基本操作¶
- 创建一个
HashSet
,添加5个不同的字符串元素,并打印集合内容。 - 尝试添加一个重复元素,观察集合内容是否发生变化。
- 删除一个元素,并打印删除后的集合内容。
练习2:LinkedHashSet的有序性¶
- 创建一个
LinkedHashSet
,添加5个不同的整数元素,并打印集合内容。 - 观察元素的顺序是否与插入顺序一致。
- 删除一个元素,并打印删除后的集合内容。
练习3:TreeSet的排序¶
- 创建一个
TreeSet
,添加5个不同的字符串元素,并打印集合内容。 - 观察元素是否按照自然顺序排列。
- 尝试添加一个
null
元素,观察是否抛出异常。
总结¶
- Set接口:
Set
接口代表一个不允许重复元素的集合,主要实现类包括HashSet
、LinkedHashSet
和TreeSet
。 - HashSet:基于哈希表实现,元素无序,允许
null
元素,操作高效。 - LinkedHashSet:在
HashSet
的基础上维护插入顺序,元素有序,允许null
元素,操作高效。 - TreeSet:基于红黑树实现,元素有序,不允许
null
元素,操作时间复杂度为O(log n)。 - 应用场景:根据具体需求选择合适的
Set
实现类,如需要快速查找且不关心顺序时使用HashSet
,需要保持插入顺序时使用LinkedHashSet
,需要排序时使用TreeSet
。
通过本文的学习,你应该已经掌握了Set
接口及其主要实现类的基本用法。接下来,你可以通过练习题进一步巩固所学知识,并在实际项目中灵活运用Set
集合。