Java中的Set
是一个接口,它继承自Collection
接口,用于存储不重复的元素集合。
创建Set对象
使用具体实现类创建:Java中
Set
接口有多种实现类,常见的有HashSet
、TreeSet
和LinkedHashSet
等。可以使用这些实现类的构造函数来创建Set
对象。HashSet
:基于哈希表实现,不保证元素的顺序,添加、删除和查找操作的性能较好。Set<Integer> hashSet = new HashSet<>(); hashSet.add(1); hashSet.add(2); hashSet.add(3); System.out.println(hashSet);
TreeSet
:基于红黑树实现,会对元素进行排序,元素必须实现Comparable
接口或者在创建TreeSet
时传入自定义的比较器。Set<Integer> treeSet = new TreeSet<>(); treeSet.add(3); treeSet.add(1); treeSet.add(2); System.out.println(treeSet);
LinkedHashSet
:继承自HashSet
,在哈希表的基础上维护了一个双向链表,保证元素按照插入的顺序存储。Set<Integer> linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add(2); linkedHashSet.add(1); linkedHashSet.add(3); System.out.println(linkedHashSet);
添加元素
- 使用
add()
方法向Set
中添加元素。如果添加的元素已经存在于Set
中,则添加操作不会生效,因为Set
不允许重复元素。Set<String> set = new HashSet<>(); set.add("apple"); set.add("banana"); set.add("cherry"); set.add("apple"); System.out.println(set);
删除元素
- 可以使用
remove()
方法根据元素的值删除元素,如果元素存在则删除并返回true
,否则返回false
。
Set<Integer> setToRemove = new HashSet<>();
setToRemove.add(1);
setToRemove.add(2);
setToRemove.add(3);
setToRemove.remove(2);
System.out.println(setToRemove);
- 还可以使用
clear()
方法一次性删除Set
中的所有元素,使Set
变为空集合。
Set<String> setToClear = new HashSet<>();
setToClear.add("one");
setToClear.add("two");
setToClear.add("three");
setToClear.clear();
System.out.println(setToClear);
遍历Set
- 可以使用增强型
for
循环遍历Set
中的元素。
Set<String> fruits = new HashSet<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("cherry");
for (String fruit : fruits) {
System.out.println(fruit);
}
- 也可以使用迭代器
Iterator
来遍历Set
。
Set<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
判断元素是否存在
- 使用
contains()
方法来判断Set
中是否包含指定的元素,返回true
或false
。
Set<Double> setContains = new HashSet<>();
setContains.add(1.1);
setContains.add(2.2);
setContains.add(3.3);
System.out.println(setContains.contains(2.2));
System.out.println(setContains.contains(4.4));
集合运算
- 交集:使用
retainAll()
方法可以求两个Set
的交集,该方法会保留当前Set
中与另一个Set
中相同的元素,返回值为true
或false
,表示当前Set
是否发生了改变。
Set<Integer> set1 = new HashSet<>();
set1.add(1);
set1.add(2);
set1.add(3);
Set<Integer> set2 = new HashSet<>();
set2.add(3);
set2.add(4);
set2.add(5);
set1.retainAll(set2);
System.out.println(set1);
- 并集:先创建一个新的
Set
,将其中一个Set
的元素添加进去,然后再使用addAll()
方法将另一个Set
的元素添加到新的Set
中,得到两个Set
的并集。
Set<Integer> unionSet1 = new HashSet<>(set1);
unionSet1.addAll(set2);
System.out.println(unionSet1);
- 差集:使用
removeAll()
方法可以求两个Set
的差集,从当前Set
中移除与另一个Set
中相同的元素。
Set<Integer> differenceSet1 = new HashSet<>(set1);
differenceSet1.removeAll(set2);
System.out.println(differenceSet1);
Set<Integer> differenceSet2 = new HashSet<>(set2);
differenceSet2.removeAll(set1);
System.out.println(differenceSet2);
注意事项
HashSet
在存储自定义对象时,需要注意重写hashCode()
和equals()
方法,以确保正确地判断元素的重复性。如果不重写这两个方法,默认的判断方式可能无法满足需求,导致集合中出现不符合预期的重复元素。TreeSet
在存储元素时,元素必须是可比较的,即实现Comparable
接口或者在创建TreeSet
时传入自定义的比较器,否则会抛出ClassCastException
异常。
总之,Java中的Set
类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的Set
实现类,并灵活运用各种方法来实现对集合的操作和处理。