Java中的Set知识汇总
在Java中,Set
是一个集合接口,继承自Collection
接口。Set
不允许存储重复的元素,其实现常用于对元素进行去重操作。以下是Java中Set
接口的相关知识汇总:
Set接口的主要实现类
HashSet:
- 基于哈希表实现,底层使用
HashMap
。 - 不保证集合迭代顺序,顺序与插入顺序可能不一致。
- 允许存储
null
值。 - 常用于快速查找。
- 基于哈希表实现,底层使用
LinkedHashSet:
- 继承自
HashSet
,基于链表和哈希表的组合实现。 - 保留元素的插入顺序,因此在迭代时顺序是确定的。
- 适合需要保持插入顺序的场合。
- 继承自
TreeSet:
- 基于红黑树实现,实现
SortedSet
接口。 - 保持元素的自然顺序(或根据
Comparator
提供的顺序)。 - 不允许存储
null
值。 - 适合需要对元素排序的场合。
- 基于红黑树实现,实现
Set的基本操作
- 添加元素:
add(E e)
,返回true
如果集合不包含某特定元素。 - 删除元素:
remove(Object o)
,删除指定元素,成功则返回true
。 - 检查是否存在:
contains(Object o)
,如果集合包含指定元素返回true
。 - 获取大小:
size()
,返回集合中元素的数量。 - 清空集合:
clear()
,移除集合中的所有元素。 - 遍历元素:可以使用增强的for循环、迭代器(
Iterator
)等方式。
Java 8 引入的增强方式
forEach:
Set
从Iterable
继承而来,利用forEach
方法可以对集合中的每个元素执行一个特定的操作。Streams: 使用
stream()
方法,可以对集合进行流式操作,如过滤、映射等。
注意事项
线程安全:
HashSet
,LinkedHashSet
,TreeSet
都不是线程安全的。当多线程访问一个Set
时,若没有外部同步,则需要通过Collections.synchronizedSet
方法来获取一个同步的集合。性能:在性能方面,
HashSet
提供最好的性能,TreeSet
由于维护顺序,性能较差。
示例代码
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Orange");
set.add("Apple"); // 重复元素不会加入
// 遍历Set
for (String fruit : set) {
System.out.println(fruit);
}
// 检查元素
boolean hasApple = set.contains("Apple");
System.out.println("Contains Apple: " + hasApple);
// 删除元素
set.remove("Banana");
// 使用迭代器
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
// 流式操作
set.stream().filter(fruit -> fruit.startsWith("A")).forEach(System.out::println);
}
}
以上总结了Java中Set
接口的基本概念、主要实现类、基本操作和一些注意事项,希望对你有帮助!