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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的有序性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值