4.3 Set接口

Set接口是一个不能包含重复元素的Collection。Set接口仅包含从Collection继承的方法,并添加禁止重复元素的限制。

Java平台包含3个通用的Set实现:

· HashSet

· TreeSet

· LinkedHashSet

可以通过下面的方式来实例化Set:

或者使用Stream的聚合操作来生成Set:

   c.stream()
   .collect(Collectors.toSet());

4.3.1 HashSet、TreeSet和LinkedHashSet的比较

HashSet将其元素存储在哈希表中,具有最佳性能,但是不能保证迭代的顺序。

TreeSet将其元素存储在红黑树中,根据其值对元素进行排序,因此它比HashSet慢得多。

LinkedHashSet实现为一个哈希表,其中包含一个链表,它根据插入集合的顺序对其元素进行排序。

4.3.2 Set接口基本操作

Set接口基本操作包括:

· size操作返回Set中的元素数。

· isEmpty方法判断集合是否是空的。

· add方法将指定的元素添加到Set并返回一个布尔值,指示是否添加了元素。

· remove方法从Set中删除指定的元素并返回一个布尔值,指示元素是否存在。

下面的程序用来打印出其参数列表中所有不同的单词,提供了该程序的两个版本:第一个使用Java 8聚合操作,第二个使用for-each。

1.使用Java 8聚合操作

以下是使用聚合操作Set的例子:

2.使用for-each

以下是使用for-each操作Set的例子:

4.3.3 Set接口批量操作

批量操作特别适合于Set。假设s1和s2是集合,Set支持以下批量操作:

· s1.containsAll(s2):如果s2是s1的子集,就返回true。

· s1.addAll(s2):将s1转换为s1和s2的并集。

· s1.retainAll(s2):将s1转换为s1和s2的交集。

· s1.removeAll(s2):将s1转换为s1和s2的(非对称)集合差异。

以下是一个Set批量操作的完整例子: