当前位置:网站首页 > 技术博客 > 正文

java中treenode



这一章,我们对 TreeSet 进行学习。
我们先对 TreeSet 有个整体认识,然后再学习它的源码,最后再通过实例来学会使用 TreeSet。内容包括:
第 1 部分 TreeSet 介绍
第 2 部分 TreeSet 数据结构
第 3 部分 TreeSet 源码解析 (基于 JDK1.6.0_45)
第 4 部分 TreeSet 遍历方式
第 5 部分 TreeSet 示例

转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=

TreeSet 简介

TreeSet 是一个有序的集合,它的作用是提供有序的 Set 集合。它继承于 AbstractSet 抽象类,实现了 NavigableSet , Cloneable, java.io.Serializable 接口。
TreeSet 继承于 AbstractSet,所以它是一个 Set 集合,具有 Set 的属性和方法。
TreeSet 实现了 NavigableSet 接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。
TreeSet 实现了 Cloneable 接口,意味着它能被克隆。
TreeSet 实现了 java.io.Serializable 接口,意味着它支持序列化。

TreeSet 是基于 TreeMap 实现的。TreeSet 中的元素支持 2 种排序方式:自然排序 或者 根据创建 TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。
TreeSet 为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。
另外,TreeSet 是非同步的。 它的 iterator 方法返回的迭代器是 fail-fast 的。

TreeSet 的构造函数

[img](javascript:void(0)😉

 

[img](javascript:void(0)😉

TreeSet 的 API

[img](javascript:void(0)😉

 

[img](javascript:void(0)😉

说明

(01) TreeSet 是有序的 Set 集合,因此支持 add、remove、get 等方法。
(02) 和 NavigableSet 一样,TreeSet 的导航方法大致可以区分为两类,一类时提供元素项的导航方法,返回某个元素;另一类时提供集合的导航方法,返回某个集合。
lower、floor、ceiling 和 higher 分别返回小于、小于等于、大于等于、大于给定元素的元素,如果不存在这样的元素,则返回 null。

TreeSet 的继承关系

[img](javascript:void(0)😉

 

[img](javascript:void(0)😉

TreeSet 与 Collection 关系如下图:

img

从图中可以看出:
(01) TreeSet 继承于 AbstractSet,并且实现了 NavigableSet 接口。
(02) TreeSet 的本质是一个 "有序的,并且没有重复元素" 的集合,它是通过 TreeMap 实现的。TreeSet 中含有一个 "NavigableMap 类型的成员变量"m,而 m 实际上是 "TreeMap 的实例"。

为了更了解 TreeSet 的原理,下面对 TreeSet 源码代码作出分析。

img

img

[img](javascript:void(0)😉

 

注意看add方法:

 

key就是我们要保存的值,value是一个PRESENT,这是什么?

 

可以看到,PRESENT就是TreeSet创建时创建的一个Object对象,它的唯一作用就是占位做Value

我们也可以从中看出,TreeSet真的是很依赖于TreeMap,许多方法干脆就是直接调用TreeMap中的同类方法,算是一个比较“浅”的子类吧

总结

(01) TreeSet 实际上是 TreeMap 实现的。当我们构造 TreeSet 时;若使用不带参数的构造函数,则 TreeSet 的使用自然比较器;若用户需要使用自定义的比较器,则需要使用带比较器的参数。
(02) TreeSet 是非线程安全的。
(03) TreeSet 实现 java.io.Serializable 的方式。当写入到输出流时,依次写入 “比较器、容量、全部元素”;当读出输入流时,再依次读取。

4.1 Iterator 顺序遍历

 

4.2 Iterator 顺序遍历

 

4.3 for-each 遍历 HashSet

 

TreeSet 遍历测试程序如下:

img

img

 

View Code

运行结果

[img](javascript:void(0)😉

 

[img](javascript:void(0)😉

下面通过实例学习如何使用 TreeSet

img

img

[img](javascript:void(0)😉

 

[img](javascript:void(0)😉

View Code

运行结果

[img](javascript:void(0)😉

 

[img](javascript:void(0)😉

  • 上一篇: slim slam
  • 下一篇: ipvsadm -c
  • 版权声明


    相关文章:

  • slim slam2025-04-09 13:30:04
  • 华为路由器单臂路由2025-04-09 13:30:04
  • psm评分匹配2025-04-09 13:30:04
  • 协程的底层原理2025-04-09 13:30:04
  • 网络调试助手使用教程2025-04-09 13:30:04
  • ipvsadm -c2025-04-09 13:30:04
  • 软件测试一般经过4个测试2025-04-09 13:30:04
  • android studio虚拟机无法启动2025-04-09 13:30:04
  • jrebel setup guide2025-04-09 13:30:04
  • linux 添加用户组新成员2025-04-09 13:30:04