Java Set用法详解含HashSet TreeSet LinkedHashSet及集合运算

Java Set用法详解含HashSet TreeSet LinkedHashSet及集合运算

Java中的Set是一个接口,它继承自Collection接口,用于存储不重复的元素集合。

创建Set对象

使用具体实现类创建:Java中Set接口有多种实现类,常见的有HashSet、TreeSet和LinkedHashSet等。可以使用这些实现类的构造函数来创建Set对象。

HashSet:基于哈希表实现,不保证元素的顺序,添加、删除和查找操作的性能较好。

Set hashSet = new HashSet<>();

hashSet.add(1);

hashSet.add(2);

hashSet.add(3);

System.out.println(hashSet);

TreeSet:基于红黑树实现,会对元素进行排序,元素必须实现Comparable接口或者在创建TreeSet时传入自定义的比较器。

Set treeSet = new TreeSet<>();

treeSet.add(3);

treeSet.add(1);

treeSet.add(2);

System.out.println(treeSet);

LinkedHashSet:继承自HashSet,在哈希表的基础上维护了一个双向链表,保证元素按照插入的顺序存储。Set linkedHashSet = new LinkedHashSet<>();

linkedHashSet.add(2);

linkedHashSet.add(1);

linkedHashSet.add(3);

System.out.println(linkedHashSet);

添加元素

使用add()方法向Set中添加元素。如果添加的元素已经存在于Set中,则添加操作不会生效,因为Set不允许重复元素。Set set = new HashSet<>();

set.add("apple");

set.add("banana");

set.add("cherry");

set.add("apple");

System.out.println(set);

删除元素

可以使用remove()方法根据元素的值删除元素,如果元素存在则删除并返回true,否则返回false。

Set setToRemove = new HashSet<>();

setToRemove.add(1);

setToRemove.add(2);

setToRemove.add(3);

setToRemove.remove(2);

System.out.println(setToRemove);

还可以使用clear()方法一次性删除Set中的所有元素,使Set变为空集合。

Set setToClear = new HashSet<>();

setToClear.add("one");

setToClear.add("two");

setToClear.add("three");

setToClear.clear();

System.out.println(setToClear);

遍历Set

可以使用增强型for循环遍历Set中的元素。

Set fruits = new HashSet<>();

fruits.add("apple");

fruits.add("banana");

fruits.add("cherry");

for (String fruit : fruits) {

System.out.println(fruit);

}

也可以使用迭代器Iterator来遍历Set。

Set numbers = new HashSet<>();

numbers.add(1);

numbers.add(2);

numbers.add(3);

Iterator iterator = numbers.iterator();

while (iterator.hasNext()) {

System.out.println(iterator.next());

}

判断元素是否存在

使用contains()方法来判断Set中是否包含指定的元素,返回true或false。

Set 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 set1 = new HashSet<>();

set1.add(1);

set1.add(2);

set1.add(3);

Set 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 unionSet1 = new HashSet<>(set1);

unionSet1.addAll(set2);

System.out.println(unionSet1);

差集:使用removeAll()方法可以求两个Set的差集,从当前Set中移除与另一个Set中相同的元素。

Set differenceSet1 = new HashSet<>(set1);

differenceSet1.removeAll(set2);

System.out.println(differenceSet1);

Set differenceSet2 = new HashSet<>(set2);

differenceSet2.removeAll(set1);

System.out.println(differenceSet2);

注意事项

HashSet在存储自定义对象时,需要注意重写hashCode()和equals()方法,以确保正确地判断元素的重复性。如果不重写这两个方法,默认的判断方式可能无法满足需求,导致集合中出现不符合预期的重复元素。

TreeSet在存储元素时,元素必须是可比较的,即实现Comparable接口或者在创建TreeSet时传入自定义的比较器,否则会抛出ClassCastException异常。

总之,Java中的Set类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的Set实现类,并灵活运用各种方法来实现对集合的操作和处理。

相关探索