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);

欢迎阅读,以及欢迎指出不足之处,如果点赞就更好了;
祝您学习愉快~😊😊😊

  • 33
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值