Java集合框架之树集(TreeSet)

devtools/2024/11/13 2:03:53/

TTreeSet 是一个非常独特且强大的集合类,它基于红黑树(Red-Black Tree)实现,不仅提供了集合的基本功能,还保证了元素的自然排序或自定义排序。本文将详细介绍 TreeSet 的特点、使用方法和一些常见注意事项。

一、TreeSet概述

TreeSet 是 java.util 包中的一个类,它实现了 NavigableSet 接口,而 NavigableSet 又扩展了 SortedSet 接口。因此,TreeSet 不仅是一个集合,还是一个有序集合。其主要特点包括:

  1. 基于红黑树实现:红黑树是一种自平衡二叉搜索树,能够在 O(log n) 时间复杂度内完成插入、删除和查找操作。
  2. 元素唯一且有序TreeSet 中的元素是唯一的,并且根据元素的自然顺序或提供的比较器(Comparator)进行排序。
  3. 不允许插入 null 元素:尝试向 TreeSet 中插入 null 会抛出 NullPointerException

二、TreeSet的基本使用

1. 自然排序

当 TreeSet 中的元素实现了 Comparable 接口时,TreeSet 会使用元素的自然顺序进行排序。例如,对于整数类型的元素,自然顺序就是从小到大的顺序。

   TreeSet<Integer> treeSet = new TreeSet<>();treeSet.add(5);treeSet.add(3);treeSet.add(8);treeSet.add(1);for (Integer num : treeSet) {System.out.println(num);}

 

输出:

1
3
5
8

复制代码

2. 自定义排序

如果元素没有实现 Comparable 接口,或者你需要自定义排序规则,可以在创建 TreeSet 时传入一个 Comparator 实例。

      // 使用Lambda表达式定义比较器,按字符串长度排序TreeSet<String> treeSet = new TreeSet<>((s1, s2) -> Integer.compare(s1.length(), s2.length()));treeSet.add("apple");treeSet.add("banana");treeSet.add("kiwi");treeSet.add("pear");for (String fruit : treeSet) {System.out.println(fruit);}

 

输出:

kiwi
pear
apple
banana

三、TreeSet的常用方法

TreeSet 继承自 AbstractSet 并实现了 NavigableSet 接口,因此它拥有许多有用的方法:

  • add(E e):向集合中添加元素。
  • remove(Object o):从集合中移除元素。
  • contains(Object o):检查集合是否包含某个元素。
  • size():返回集合中元素的个数。
  • isEmpty():检查集合是否为空。
  • headSet(E toElement):返回小于 toElement 的部分视图。
  • tailSet(E fromElement):返回大于或等于 fromElement 的部分视图。
  • subSet(E fromElement, E toElement):返回从 fromElement 到 toElement 的部分视图。
  • first():返回集合中的第一个元素(最小的元素)。
  • last():返回集合中的最后一个元素(最大的元素)。
  • pollFirst():获取并移除集合中的第一个元素。
  • pollLast():获取并移除集合中的最后一个元素。

四、注意事项

  1. 元素类型TreeSet 的元素类型必须实现 Comparable 接口,或者在创建 TreeSet 时提供一个 Comparator
  2. 性能:由于 TreeSet 基于红黑树实现,其插入、删除和查找操作的时间复杂度为 O(log n),但遍历操作的时间复杂度为 O(n)。
  3. 线程安全TreeSet 不是线程安全的。如果需要在多线程环境中使用,可以考虑使用 Collections.synchronizedSet(new TreeSet<>()) 或 CopyOnWriteArraySet 等线程安全的集合类。

五、总结

TreeSet 是 Java 集合框架中一个非常有用的类,它结合了集合的特性和排序的功能,使得在需要有序集合的场景下变得非常方便。通过自然排序或自定义排序,TreeSet 能够满足多种不同的需求。同时,其基于红黑树的实现保证了高效的插入、删除和查找操作。希望本文能帮助你更好地理解和使用 TreeSet

 


http://www.ppmy.cn/devtools/133264.html

相关文章

计算机网络作业八

Computer Networks Assignment 8 一、问题描述 Assignment 8: Fast! Fast! Fast! 1. Assuming the underlying network layer uses IP protocol, try design a transfer layer protocol that is suitable for Interstellar communications. 2.Assuming you have total cont…

oracle常用查询sql

查询表空间 --- 查询表空间信息 select * from v$tablespace;--- 查看每个表空间的数据文件 desc dba_data_files;--- 查看详细数据文件 select file_name,tablespace_name from dba_data_files;select * from dba_data_files; --describes database files 数据文件信息 se…

【Lucene】从文本到索引:Lucene如何构建索引

Lucene 构建索引的过程是将非结构化文本数据转化为结构化的倒排索引&#xff0c;以便实现快速的全文检索。Lucene的索引构建分为几个关键步骤&#xff0c;从文本解析、词元化&#xff0c;到最终的索引存储。 以下是Lucene构建索引的详细流程&#xff1a; 1. 索引构建流程 在L…

Redis 缓存击穿

目录 缓存击穿 什么是缓存击穿&#xff1f; 有哪些解决办法&#xff1f; 缓存穿透和缓存击穿有什么区别&#xff1f; 缓存雪崩 什么是缓存雪崩&#xff1f; 有哪些解决办法&#xff1f; 缓存预热如何实现&#xff1f; 缓存雪崩和缓存击穿有什么区别&#xff1f; 如何保…

项目管理中不可或缺的能力

在现代企业中&#xff0c;项目管理是一项至关重要的能力。项目管理需要具备的能力包括&#xff1a;有效的沟通能力、团队协作能力、时间管理能力、风险管理能力、以及问题解决能力。 其中&#xff0c;有效的沟通能力尤为重要&#xff0c;它不仅涉及到信息的传递&#xff0c;还包…

VSCode + linux 远程免密登录

目录 一. VS Code端1. 安装插件Remote - SSH2. 配置config文件3. 公钥生成 二、远程服务器端1. 将生成的公钥发送到远程服务器 三、连接1. 准备就绪后&#xff0c;VSCode连接 一. VS Code端 1. 安装插件Remote - SSH 2. 配置config文件 Host H5WebHostName xx.xx.xx.xxUser ro…

MySQL库的操作

文章目录 创建数据库删除数据库查看数据库修改数据库字符集和校验规则查看系统默认的字符集查看系统默认的字符集校验规则查看数据库支持的字符集查看数据库支持的字符集校验规则校验规则对数据库的影响 数据库的备份和恢复备份恢复 创建数据库 本质就是在/var/lib/mysql创建一…

两个matlab在线编译网站

octave &#xff08;有时候会打不开&#xff09; 菜鸟