📅  最后修改于: 2023-12-03 15:01:32.131000             🧑  作者: Mango
Set 是 Java Collection framework 中的一种数据结构,可以存储不重复的对象。Java 中提供了多种 Set 实现,如 HashSet, TreeSet 和 LinkedHashSet 等,每种实现都有其独特的特点和适用场景。
HashSet 是最常用的 Set 实现之一,底层通过 HashMap 实现。HashSet 中存储的元素是无序的,因为其内部是使用散列表(hash table)实现的。HashSet 具有 O(1) 的插入、删除和.contains() 操作的平均时间复杂度。
Set<String> hashSet = new HashSet<String>();
hashSet.add("Hello");
hashSet.add("World");
hashSet.remove("Hello");
hashSet.contains("Hello");
TreeSet 是基于红黑树实现的,内部自动排好序。由于其元素时有序的,所以查找效率比 HashSet 要快,但插入和删除操作比 HashSet 要慢。TreeSet 也可以自定义排序方式。
创建 TreeSet 及其方式和创建 HashSet 是一样的。
Set<String> treeSet = new TreeSet<String>();
treeSet.add("Hello");
treeSet.add("World");
treeSet.remove("Hello");
treeSet.contains("Hello");
Set<Integer> descendingSet = new TreeSet<Integer>(new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
LinkedHashSet 是 HashedSet 的子类,具有插入的顺序性。内部使用 LinkedHashMap 维护元素的顺序,性能略低于 HashSet,但可以避免 HashSet 的元素无序问题。
创建 LinkedHashSet 及其方式和创建 HashSet 是一样的。
Set<String> linkedHashSet = new LinkedHashSet<String>();
linkedHashSet.add("Hello");
linkedHashSet.add("World");
linkedHashSet.remove("Hello");
linkedHashSet.contains("Hello");
Java 中的 Set 接口也提供了一些集合运算方法,如并集(union)、交集(intersection)、差集(difference)等。
Set<Integer> set1 = new HashSet<Integer>(Arrays.asList(1, 2, 3));
Set<Integer> set2 = new HashSet<Integer>(Arrays.asList(2, 3, 4));
Set<Integer> union = new HashSet<Integer>(set1);
union.addAll(set2); // union = {1, 2, 3, 4}
Set<Integer> set1 = new HashSet<Integer>(Arrays.asList(1, 2, 3));
Set<Integer> set2 = new HashSet<Integer>(Arrays.asList(2, 3, 4));
Set<Integer> intersection = new HashSet<Integer>(set1);
intersection.retainAll(set2); // intersection = {2, 3}
Set<Integer> set1 = new HashSet<Integer>(Arrays.asList(1, 2, 3));
Set<Integer> set2 = new HashSet<Integer>(Arrays.asList(2, 3, 4));
Set<Integer> difference = new HashSet<Integer>(set1);
difference.removeAll(set2); // difference = {1}
以上就是 Java Set 操作的介绍,涉及 HashSet、TreeSet 和 LinkedHashSet 的基本使用方法以及集合运算,需要根据具体的需求选择合适的 Set 实现。