TreeSet唯一性以及有序性底层剖析

本文深入讲解TreeSet的数据结构——红黑树,一种自平衡的二叉查找树,并详细阐述其如何确保元素的有序性和唯一性。通过源码分析,解释TreeSet如何利用Comparable接口的compare方法来决定元素的插入位置。

TreeSet底层原理

TreeSet底层数据结构是红黑树(一种自平衡的二叉树,自平衡是指如果有空的左/右子树,元素会先入空的左/右子树,而不会一直往一个方方向添加元素出现不平衡现象)。

这里写图片描述

该自平衡二叉树保证了元素的有序性(存储逻辑顺序),因为按照前、中、后三种顺序都可以有序的读取到集合中的元素。
下面是关键底层源码:
发现add方法中调用了TreeSet中的一个成员变量m.put()方法。

这里写图片描述

这里写图片描述

而NavigableMap是一个接口,但是它有一个实现类是TreeMap:

这里写图片描述

那么,就应该看看TreeSet中该m变量的初始化到底是哪个实现类了:

这里写图片描述

看到默认构造器中为TreeMap,则可以知道m.put()方法实际调用的是TreeMap中的put()方法,跟踪进入源码:

这里写图片描述

这里写图片描述

总结:通过观察TreeSet的底层源码发现,TreeSet的add(E e)方法,底层是根据实现Comparable的方式来实现的唯一性,通过compare(Object o)的返回值是否为0来判断是否为同一元素。
compare() == 0,元素不入集合。
compare() > 0 ,元素入右子树。
compare() < 0,元素入左子树。
而对其数据结构:自平衡二叉树做前(常用)、中、后序遍历即可保证TreeSet的有序性。

Java 集合框架与 Stream 流深入剖析 一、Java 集合框架概述 集合框架的作用 集合接口层次结构 Collection 接口 Map 接口 二、List 接口及实现类 List 接口特点 有序性 可重复性 ArrayList 底层实现(数组) 动态扩容机制 常见方法及示例 add() get() set() remove() 优缺点 LinkedList 底层实现(双向链表) 常见方法及示例 addFirst() addLast() getFirst() getLast() 优缺点 三、Set 接口及实现类 Set 接口特点 唯一性 无序性 HashSet 底层实现(哈希表) 哈希算法与元素存储 常见方法及示例 add() contains() remove() 优缺点 TreeSet 底层实现(红黑树) 元素排序方式 常见方法及示例 add() first() last() 优缺点 四、Map 接口及实现类 Map 接口特点 键值对存储 键的唯一性 HashMap 底层实现(哈希表) 哈希冲突处理 常见方法及示例 put() get() remove() entrySet() 优缺点 TreeMap 底层实现(红黑树) 键的排序方式 常见方法及示例 put() firstKey() lastKey() 优缺点 LinkedHashMap 底层实现(哈希表 + 双向链表) 访问顺序与插入顺序 常见方法及示例 优缺点 五、Java Stream 流 Stream 流的概念 Stream 流的特点 惰性求值 声明式编程 支持并行处理 创建 Stream 流的方式 从集合创建 使用 Stream.of () 方法 使用 Arrays.stream () 方法 Stream 流的中间操作 filter() map() flatMap() distinct() sorted() limit() skip() Stream 流的终端操作 forEach() collect() reduce() count() anyMatch() allMatch() noneMatch() findFirst() findAny() 六、集合框架与 Stream 流的结合使用 使用 Stream 流处理集合数据 示例:对集合进行过滤、映射、统计等操作 按照内容写一个思维导图
最新发布
04-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值