目录
- Java的Set集合
- Set集合的特性和常用方法
- Set与Map的关系
- 常用的Set实现类
- 1. HashSet
- 2. TreeSet
- 总结
Java的Set集合
Set集合的特性和常用方法
Set
最显著的特点就是元素不可重复,这一特性使其常被用于去重操作。常用方法如下:
boolean add(E e)
:向集合中添加元素,若元素已存在则返回false
boolean remove(Object e)
:从集合中删除元素,若元素不存在则返回false
boolean contains(Object e)
:判断集合中是否包含指定元素int size()
:返回集合中元素的数量
Set与Map的关系
从本质上来说,Set
可以看作是只存储key而不存储value的Map
。因此,放入Set
的元素需要像Map
的key一样,正确实现equals()
和hashCode()
方法,否则无法保证去重功能的正确性。
以最常用的HashSet
为例,HashSet
仅仅是对HashMap
的一个简单封装,它的核心代码如下:
public class HashSet<E> implements Set<E> {// 持有一个HashMap:private HashMap<E, Object> map = new HashMap<>();// 放入HashMap的value:private static final Object PRESENT = new Object();public boolean add(E e) {return map.put(e, PRESENT) == null;}public boolean contains(Object o) {return map.containsKey(o);}public boolean remove(Object o) {return map.remove(o) == PRESENT;}
}
常用的Set实现类
1. HashSet
HashSet
是最常用的Set
实现类,它具有以下特点:
- 基于哈希表实现
- 元素无序(遍历顺序与添加顺序无关)
- 查找、添加、删除操作效率高(时间复杂度为O(1))
2. TreeSet
TreeSet
实现了SortedSet
接口,它的特点是:
- 元素是有序的(按照自然顺序或自定义顺序)
- 基于红黑树实现
- 查找、添加、删除操作时间复杂度为O(log n)
使用TreeSet
时,元素需要满足以下条件之一:
- 实现
Comparable
接口,重写compareTo()
方法 - 创建
TreeSet
时传入Comparator
对象
下面是TreeSet
的简单示例:
import java.util.*;public class TreeSetDemo {public static void main(String[] args) {Set<String> set = new TreeSet<>();set.add("orange");set.add("apple");set.add("banana");// 遍历输出时会按字母顺序排列for (String s : set) {System.out.println(s); // 输出apple, banana, orange}}
}
总结
Set
用于存储不重复的元素,常用方法包括add()
、remove()
、contains()
和size()
HashSet
基于哈希表实现,元素无序但性能优异TreeSet
基于红黑树实现,元素有序但性能稍逊- 放入
Set
的元素必须正确实现equals()
和hashCode()
方法 Set
非常适合用于去重操作和需要判断元素是否存在的场景