Java # The Set Interface
Set 接口
Set Interface
Set是集合的一个形式,Set不能包含重复的元素(elements)。Set 接口 只包含从 Collection 继承过来的方法; Set 也为equals方法和hashCode方法添加了一个强大的内容,允许Set实例进行有意义的比较,即使他们的实现类型不一样。两个Set 实例相等,如果它们含有相同的元素。
Java 平台包含三个通用Set实现:HashSet、TreeSet和LinkedHashSet:
- HashSet,它将其元素存储在哈希表中,是性能最好的实现;但是它不保证迭代的顺序。
- TreeSet,它将其元素存储在红黑树中,并根据其值对其元素进行排序;它比 HashSet 慢得多HashSet.
- LinkedHashSet,它被实现为一个带有链表的哈希表,根据元素插入集合的顺序(插入顺序)对其元素进行排序。LinkedHashSet使客户免于以HashSet仅略高的成本提供的未指定的、通常混乱的订购。
这是一个简单但有用的Set示例。假设您有一个Collection c 包含相同元素, 并且您想要创建另一个Collection 消除所有重复项的元素。下面就可以解决这个问题:
Collection<Type> noDups = new HashSet<Type>(c);
它的工作原理是创建一个Set(根据定义,不能包含重复项)。
或者,如果使用 JDK 8 或更高版本,使用聚合操作得到Set :
c.stream()
.collect(Collectors.toSet()); // 没有重复项
以下是第一个习惯用法的一个小变体,它在删除重复元素的同时保留原始集合的顺序:
Collection<Type> noDups = new LinkedHashSet<Type>(c);
Set 接口基本操作
Set Interface Basic Operations
- size(): int 操作返回的是Set中 元素(elements)的数量
- isEmpty(): boolean 操作返回 true,如果Set 为空
- add(): boolean 操作返回 true,如果成功把元素添加到Set中(前提:Set中之前不包含要添加的元素)
- remove(): boolean 删除Set中指定的元素(前提:元素在Set中),然后返回 true
- iterator(): Iterator 遍历后返回一个Iterator对象
Set 接口批量操作
Set Interface Bulk Operations
批量操作特别适合Set:应用时,它们执行标准的Set 代数运算。假设s1和s2是Set 。以下是批量操作的示例:
- s1.containsAll(s2) 返回 true 如果 s2 是 s1的子集
- s1.addAll(s2) 把s1变为 s1 s2的并集,还是存储在s1
- s1.retainAll(s2) 转为 s1 和 s2 的交集
- s1.removeAll(s2) 从s1 中去除所有 s2 包含的元素
要非破坏性地计算两个集合的并集、交集或集合差(不修改任一集合),调用者必须在调用相应的批量操作之前复制一组集合。以下是由此产生的示例:
//并集
Set<Type> union = new HashSet<Type>(s1);
union.addAll(s2);
//交集
Set<Type> intersection = new HashSet<Type>(s1);
intersection.retainAll(s2);
//集合1 减去集合2(求差)
Set<Type> difference = new HashSet<Type>(s1);
difference.removeAll(s2);
欢迎阅读,以及欢迎指出不足之处,如果点赞就更好了;
祝您学习愉快~😊😊😊