
上QQ阅读APP看书,第一时间看更新
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批量操作的完整例子:
