239. Java 集合 - 通过 Set、SortedSet 和 NavigableSet 扩展 Collection 接口

🧐 探索 Set 接口

Set 接口继承自 Collection 接口,主要用于集合中不允许有重复元素 。与 List 不同,Set 不保证元素的顺序,这意味着在你向 Set 中添加元素时,它们的顺序不一定与插入顺序相同。

HashSet 是实现 Set 接口的最常见类,它内部使用 HashMap 来存储元素,但对外提供的是一个集合视图。

示例:使用 HashSet 存储元素
java 复制代码
import java.util.*;

public class SetExample {
    public static void main(String[] args) {
        List<String> strings = List.of("one", "two", "three", "four", "five", "six");
        Set<String> set = new HashSet<>();
        set.addAll(strings);
        set.forEach(System.out::println);
    }
}
运行结果:
java 复制代码
six
four
one
two
three
five

如上所示,HashSet 的遍历顺序是随机的,无法保证按照添加顺序输出。因此,在使用 Set 时,不应依赖于元素的遍历顺序。


🌱 通过 SortedSet 扩展 Set

SortedSet 接口扩展了 Set 接口,使得集合中的元素按照自然顺序或自定义的比较器排序。TreeSet 是实现 SortedSet 接口的常见类,它会将元素排序,并提供一些额外的操作方法。

SortedSet 额外方法:
  • first() 和 last():返回集合中的最小元素和最大元素。
  • headSet(toElement)tailSet(fromElement) :返回一个包含小于 toElement 或大于 fromElement 的子集。
  • subSet(fromElement, toElement) :返回一个包含在 fromElementtoElement 之间的子集。

注意:toElement 不会包含在结果中,而 fromElement 会被包含。

示例:使用 SortedSet 获取子集
java 复制代码
import java.util.*;

public class SortedSetExample {
    public static void main(String[] args) {
        SortedSet<String> strings = new TreeSet<>(Set.of("a", "b", "c", "d", "e", "f"));
        SortedSet<String> subSet = strings.subSet("aa", "d");
        System.out.println("sub set = " + subSet);
    }
}
运行结果:
java 复制代码
sub set = [b, c]

subSet 方法返回的子集是一个视图,对其的修改会直接影响原始集合。

注意:
  • 你不能通过子集添加不符合限制条件的元素。例如,在 headSet 中,添加一个大于 toElement 的元素会抛出 IllegalArgumentException

NavigableSet 是对 SortedSet 的进一步扩展,提供了更多的操作方法,使得你能够更灵活地处理排序的集合。

TreeSet 也实现了 NavigableSet,因此你可以使用 TreeSet 来执行所有 NavigableSet 的操作。

  • ceiling(element)floor(element) :返回小于或等于指定元素的最大元素,大于或等于指定元素的最小元素。如果没有找到,返回 null
  • lower(element)higher(element) :返回小于指定元素的最大元素,或大于指定元素的最小元素。如果没有找到,返回 null
  • pollFirst()pollLast():返回并移除集合中的第一个和最后一个元素。
  • descendingIterator():返回一个倒序遍历集合的迭代器。
  • descendingSet() :返回一个反向顺序的 NavigableSet
java 复制代码
import java.util.*;

public class NavigableSetExample {
    public static void main(String[] args) {
        NavigableSet<String> sortedStrings = new TreeSet<>(Set.of("a", "b", "c", "d", "e", "f"));
        System.out.println("sorted strings = " + sortedStrings);
        
        NavigableSet<String> reversedStrings = sortedStrings.descendingSet();
        System.out.println("reversed strings = " + reversedStrings);
    }
}
运行结果:
java 复制代码
sorted strings = [a, b, c, d, e, f]
reversed strings = [f, e, d, c, b, a]

descendingSet() 方法返回一个新的 NavigableSet,这个集合是原集合的倒序视图。


🎯 小结

  1. Set 接口:不允许重复元素,且不保证元素的顺序。
  2. SortedSet 接口:保持集合元素的排序,提供了子集、头部集和尾部集等方法。
  3. NavigableSet 接口 :扩展了 SortedSet,提供更多的导航功能,如反向遍历、查询上下界元素等。
相关推荐
killerbasd1 小时前
牧苏苏传 我不装了 4/7
前端·javascript·vue.js
吴声子夜歌1 小时前
ES6——二进制数组详解
前端·ecmascript·es6
我是大猴子1 小时前
Spring代理类为何依赖注入失效?
java·后端·spring
码事漫谈2 小时前
手把手带你部署本地模型,让你Token自由(小白专属)
前端·后端
ZC跨境爬虫2 小时前
【爬虫实战对比】Requests vs Scrapy 笔趣阁小说爬虫,从单线程到高效并发的全方位升级
前端·爬虫·scrapy·html
爱上好庆祝2 小时前
svg图片
前端·css·学习·html·css3
王夏奇2 小时前
python中的__all__ 具体用法
java·前端·python
大家的林语冰3 小时前
《前端周刊》尤大开源 Vite+ 全家桶,前端工业革命启动;尤大爆料 Void 云服务新产品,Vite 进军全栈开发;ECMA 源码映射规范......
前端·javascript·vue.js
码农BookSea3 小时前
ReAct:让大模型学会边想边做
后端·ai编程
码农BookSea3 小时前
10分钟掌握 JSON-RPC 协议,面试加分、设计不踩坑
后端