Collection容器家族(TreeSet源码详解)

Java基础:集合 集合在我们的日常开发中所使用的次数简直太多了,你已经把它们都用的熟透了,但是作为一名合格的程序员,你不仅要了解它的基本用法,你还要了解它的源码;存在即合理,你还要了解它是如何设计和实现的,你还要了解它的衍生过程。这篇博客就来详细介绍一下Collection这个庞大集合框架的家族体系和成员,让你了解它的设计与实现。 阅读详情

一、在Collection集合体系中的位置及概述 

        TreeSet继承自AbstractSet抽象类,实现了NavigableSet、Serializable、Cloneable、RandomAccess接口。它的特点是存储元素唯一,无序(输入和输出无序)。 TreeSet默认情况下是基于TreeMap实现的,是对TreeMap的封装。默认情况下和TreeMap一样,采用元素的内部比较器Comparable的compareTo方法来比较元素的大小。如果不用内部比较器,就需要在外部传入一个Comparator的实现类来比较。由于TreeMap实现中采用红黑树实现,所以add,remove,contains方法的时间复杂度最坏情况下能保证log( n )。

二、成员变量

    // 存放元素的Map,必须是实现了NavigableMap接口的类
    private transient NavigableMap<E,Object> m;

    // Dummy value to associate with an Object in the backing Map
    // 一个虚拟值,用于添加元素到map中时,key为元素的值,value用此虚拟值代替
    private static final Object PRESENT = new Object();

三、构造方法

    // 自定义实现了NavigableMap接口的Map来作为实现
    TreeSet(NavigableMap<E,Object> m) {
        this.m = m;
    }

    // 默认构造方法用TreeMap来实现
    public TreeSet() {
        this(new TreeMap<E,Object>());
    }

    // 以定制排序方式创建一个新的 TreeMap,
    // 根据该 TreeSet 创建一个 TreeSet,
    // 使用该 TreeMap 的 key 来保存 Set 集合的元素
    public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }

    //使用参数集合的元素构造本集合
    public TreeSet(Collection<? extends E> c) {
        // 无参构造器创建一个TreeSet,底层以TreeMap保存集合元素
        this();
        // 向TreeSet中添加Collection集合c里的所有元素
        addAll(c);
    }

    public TreeSet(SortedSet<E> s) {
        // 调用带比较器参数的构造器创建衣蛾TreeSet,底层以TreeMap保存集合元素
        this(s.comparator());
        // 向TreeSet中添加SortedSet集合s里的所有元素
        addAll(s);
    }

其中涉及到addAll方法:

    // 将参数集合中所有元素添加到本集合中
    public  boolean addAll(Collection<? extends E> c) {
        // Use linear-time version if applicable
        // 条件:本集合为空、参数集合有元素、参数集合是SortedSet类型、m是TreeMap类型
        if (m.size()==0 && c.size() > 0 &&
            c instanceof SortedSet &&
            m instanceof TreeMap) {
            SortedSet<? extends E> set = (SortedSet<? extends E>) c;
            TreeMap<E,Object> map = (TreeMap<E, Object>) m;
            Comparator<?> cc = set.comparator();    // 获取比较器
            Comparator<? super E> mc = map.comparator();    // 获取比较器
            if (cc==mc || (cc != null && cc.equals(mc))) {  // 如果本集合比较器和参数集合比较器相同
                map.addAllForTreeSet(set, PRESENT); // 使用TreeMap的addAllForTreeSet方法将参数集合所有元素添加到本集合
                return true;
            }
        }
        return super.addAll(c); // 不满足上诉条件,则调用AbstractCollection超类的addAll方法添加
    }

其中涉及到TreeMap的addAllForTreeSet方法,查看我之前的博客。

四、常用API

1.添加元素

    // 添加元素
    public boolean add(E e) {
        // 调用TreeMap的put方法添加
        return m.put(e, PRESENT)==null;
    }

    // 将参数集合中所有元素添加到本集合中
    public  boolean addAll(Collection<? extends E> c) {
        // Use linear-time version if applicable
        // 条件:本集合为空、参数集合有元素、参数集合是SortedSet类型、m是TreeMap类型
        if (m.size()==0 && c.size() > 0 &&
            c instanceof SortedSet &&
            m instanceof TreeMap) {
            SortedSet<? extends E> set = (SortedSet<? extends E>) c;
            TreeMap<E,Object> map = (TreeMap<E, Object>) m;
            Comparator<?> cc = set.comparator();    // 获取比较器
            Comparator<? super E> mc = map.comparator();    // 获取比较器
            if (cc==mc || (cc != null && cc.equals(mc))) {  // 如果本集合比较器和参数集合比较器相同
                map.addAllForTreeSet(set, PRESENT); // 使用TreeMap的addAllForTreeSet方法将参数集合所有元素添加到本集合
                return true;
            }
        }
        return super.addAll(c); // 不满足上诉条件,则调用AbstractCollection超类的addAll方法添加
    }

2.删除元素

    // 清空集合所有元素
    public void clear() {
        // 调用TreeMap方法清除
        m.clear();
    }

    // 移除参数元素
    public boolean remove(Object o) {
        // 调用TreeMap方法清除
        return m.remove(o)==PRESENT;
    }

3.遍历操作

    public Iterator<E> iterator() {
        // 调用TreeMap方法清除
        return m.navigableKeySet().iterator();
    }

五、总结

        TreeSet原码中方法比较少,原因是因为他是TreeMap的封装类对象。提的的就不在此赘述了。

别再死记硬背了!用‘小乌龟’实战图解ROS1核心指令(rosnode/rostopic/rosparam保姆级手册) 本文通过经典的turtlesim乌龟仿真器,以可视化实战方式讲解ROS1核心指令(rosnode/rostopic/rosparam),帮助初学者摆脱死记硬背,在操控乌龟的过程中轻松掌握节点管理、话题通信和参数设置等ROS1核心概念。 阅读详情

相关推荐

用STM32手搓一个体温计

市面上大多额温计、测温计精度。

m0_61687959的博客 2375

java 容器 set_从零开始的Java容器学习(九):Set系列

前言前面学了List,Map,现在来学Set。在存储元素时,List允许重复,如果不允许重复时就要使用Set了,在jdk中提供的Set实现是利用Map中Key不可重复,将Set的value作为Map的Key来存储实现的。那么既然底层是Map,key有了那value存什么呢?且看下文分析Set系列容器的简要介绍HashSet继承自AbstractSet,实现了Cloneable、Set、Serial...

weixin_35450313的博客 208

PX4自定义uORB消息与MAVLink消息映射实战:从飞控到QGC地面站完整流程解析

本文详细解析PX4飞控中自定义uORB消息与MAVLink消息映射的完整流程,涵盖从飞控内部消息定义、MAVLink消息创建到QGC地面站接收显示的全链路实践。重点介绍如何使用mavlink inspector工具进行调试,解决版本兼容性和多实例消息处理等常见问题,为无人机开发者提供可靠的实时数据监控方案。

ll5678的博客 1067

TreeSet继承Set

package com.newedu.jb.day18.set; import java.util.TreeSet; /** *TreeSet的特点: * 是Set接口的实现类 *  * 1:内部依赖红黑树(自平衡二叉树) 默认对元素进行自然排序 * 2:元素不允许重复 * 3:不允许null值的出现。 * 4:存取有序吗?存取无效 * 5:线程不安全,效率高 *  * 举例说明: *  * 存取...

yy1711408814的博客 462

rk3576之imx415 4k@60fps

1;0;1;0;1;0;1;0;1;0;1;0;1;0;

darennet的专栏 704

Android 16(API 36)状态栏颜色适配全攻略:从沉浸式到自定义背景

本文全面解析Android 16(API 36)强制沉浸式状态栏带来的适配挑战,提供了从FrameLayout包裹法到动态修改Window背景色的核心解决方案。针对传统状态栏颜色设置失效问题,详细阐述了如何利用WindowInsets API实现自定义背景,并涵盖全屏模式、Fragment切换及第三方ROM兼容性等实战场景,为开发者提供一站式适配指南。

weixin_29227425的博客 594

java提高篇(二十)-----集合大家族

在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等等! 上面的图展示...

chenssy 的技术博客 593

【AI Agent 记忆共享实战】【下篇】多 Agent 会话 Session 统一共享实战:全链路工程落地、采集归一、MCP 服务、私有化部署、源码级实战

中篇我们已经锁定最终最优架构方案: 非侵入式、外部旁路采集、只读归一、中心化存储、MCP 按需检索注入。摒弃「改 Agent 源码」「软链接互通」「原生 Session 互导」等不现实方案。本篇直接落地可上线、可简历复用、可个人私有化部署多 Agent 异构 Session专属采集器(Claude/CODex/DSH/OpenCode/Kimi/WorkBuddy/ 豆包)统一消息归一化解析层(解决所有 Schema 异构)增量同步、去重、时间戳对齐核心逻辑。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 480

TreeSet集合用法和特点

TreeSet集合概述和特点 .元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法 TreeSet():根据其元素的自然排序进行排序 TreeSet(Comparator comparator):根据指定的比较器进行排序 没有带索引的方法,所以不能使用普通for循环遍历 由于是Set集合,所以不包含重复元素的集合 因为采用的是无参构造方法,所以输出的是自然顺序...

mubiakai的博客 410

《QGIS快速入门与应用基础》191:渐变区间设置(等间隔/分位数)

深入解析QGIS中渐变符号化的核心环节——渐变区间设置,重点对比等间隔与分位数两种主流模式的原理与应用。作者指出,90%的渐变效果问题源于区间设置不当,强调必须先分析数据分布特征(通过统计面板查看直方图、极值等)再选择匹配模式。等间隔模式适用于均匀分布数据(如海拔、温度),将数值范围均等划分;分位数模式则针对偏态数据(如GDP、人口),保证每个区间要素数量相等。文章通过界面示意图、效果对比图和操作步骤详解,指导读者根据数据类型选择合适区间模式,并提醒常见避坑要点:社会经济数据禁用等间隔、分类数不超过8类。

LuckyHanMo的博客 315

Android CCodec (十一) Codec2Buffer BufferPool分析

1、序言 2、C2BlockPool分析 3、SimpleC2Component关于BlockingBlockPool的实现 4、总结

给大佬递杯卡布奇诺的博客 4022

【集合详解】Java集合总结(上)-Collection家族

今天我们谈一谈集合。对比数组①数组长度不可变化。集合可以。 ②数组无法保存具有映射关系的数据。如 语文-90。集合可以。 ③数组保存的既可以是对象(实际上是保存对象的引用变量),也可以是基本类型的值。集合只保存对象(实际上也是保存对象的引用变量)。Java的集合类主要由两个根接口派生而出,Collection和Map。这些接口又包含了一些子接口和实现类。我们先看一下Collection家族Co

博学之,审问之,慎思之,明辨之,笃行之 1786

基于Jeecgboot3.9.0的文档管理系统(四)

基于Jeecgboot3.9.0的文档管理系统(四)

宁波阿成的博客 251

Java容器系列(一)Collection大家族

一、简介 Collection: Collection表示一组对象,它是集中,收集的意思,就是把一些数据收集起来。Collection函数库是在java.util包下的一下接口和类,类是用来产生对象存放数据用的,而接口是访问数据的方式。 Collection函数库与数组的两点不同: 1、数组的容量是有限制的,而Collection库没有限制,它的容量可以自动的调节大小。 2、Collec...

liuguoxionglang的博客 376

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

生动形象地说明集合框架家族

首先第一大类接口(爷爷)Collection,被第二大类接口(爸爸)list和set继承 首先说明第二大类接口的list(list爸爸): 1.可以允许重复的对象。 2.可以有多个null。 3.是一个有序集合(容器),保持了每个元素的插入顺序,输出的顺序就是插入的顺序。 4.常用的实现类(儿子)有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了...

空空空的博客 219

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

容器(十):Collection三足鼎立之Set

容器(十):Collection三足鼎立之Set标签: Java编程思想容器十Collection三足鼎立之Set Set接口简介 Set源码分析 总结 Set接口简介public interface Set<E> extends Collection<E>Set是Collection家族中的一份子,它的概念类似于数学中的“集合”,它与List的区别就是:Set不包含重复元素的集合。当对Set中添加

japson的专栏 286

Java学习笔记——容器

本文是对于JAVA容器的全面总结,主要内容均来源于他人博客,为了便于自己学习才拷贝到自己博客目录下,但是中间也加入了一些源码分析。 Java容器家族图 容器从最大的概念来分:分为Collection和Map,区别就是Collection是一个槽的,Map是两个槽的(键值对) Collection划分为:List,Set,Queue  List接口常见有:

bingzhixi的博客 297

Java集合框架深度解析:从数据结构到并发容器实战

集合框架是Java语言中用于存储和操作数据组的核心API,其设计基于经典的数据结构理论,如数组、链表、哈希表和树。理解其底层原理,例如HashMap的哈希冲突解决与扩容机制,是掌握Java基础的关键。这些技术价值在于,它们直接决定了程序在数据存取、遍历和修改时的性能表现,是构建高效、稳定应用的基础。在实际开发中,集合被广泛应用于缓存管理、任务调度、数据聚合等场景。本文聚焦于Java集合框架的深度解析,特别是针对高并发环境下的线程安全容器,如ConcurrentHashMap的锁分段与CAS优化,以及Copy

weixin_30435261的博客 400

Java集合

集合 集合概念 对象的容器,实现了对对象常用的操作,类似数组功能。 集合和数组的区别: 数组长度固定,集合长度不固定 数组可以存储基本数据类型和引用类型,集合不能直接存储基本数据类型另外集合也不能直接存储java对象(换句话按说,集合只能存储引用类型)。 位置都在 java.util包里。 java中集合分为两大类 一类是单个方式存储元素,这一类集合中超级父接口:java.util.Collection 一类是以键值对的方式存储元素,这一类集合中超级父接口:java.util.Map Collecti

小小周的博客 182

Java集合框架深度解析:从数据结构到实战应用

在Java编程中,集合框架是管理对象组的基础工具,其核心原理基于不同的数据结构实现。例如,ArrayList基于动态数组,支持快速随机访问;HashMap则利用哈希表实现高效的键值对存储。理解这些底层数据结构的工作原理,对于优化程序性能至关重要。集合框架的技术价值在于提供了统一、高效的API,能够应对各种数据管理需求,如去重、排序和并发访问。在实际应用场景中,开发者需要根据具体需求选择合适的集合类型,例如在需要快速查找时使用HashSet,在需要保持插入顺序时使用LinkedHashMap。本文通过分析Ar

weixin_34409357的博客 341

从源码到实战:深度剖析Java集合核心面试题

本文深度剖析Java集合框架的核心面试题,从源码层面解析ArrayList、LinkedList、HashMap等关键类的实现原理与优化策略。涵盖线程安全集合方案对比及性能优化实战经验,帮助开发者掌握集合框架的精髓,提升面试表现和实际开发能力。

weixin_34268579的博客 426

集合以及迭代器底层原理

1.集合是Java API所提供的一些列类,可以用于动态存放多个对象(集合只能存对象)2.集合与数组的不同在于,集合是大小可变的序列,而元素类型可以不受限定,只要是引用类型(集合当中不能存放基本数据类型,但是可以存放基本数据类型对应的包装类)。3.集合类全部支持泛型,是一种数据安全的用法。

qq_74012324的博客 446

【Java 集合】常用的Java集合框架体系详解(134)

1.常用的Java集合框架体系详解

qq_42139049的博客 248

JB1-4-高级进阶(一)

异常(处理,分类,家族),处理方案(try,catch,finally,try-with-resources,return,throws,throw),异常方法重写原则,泛型(类泛型,形参泛型,泛型限定),List容器(ArrayList,LinkedList),Set容器(HashSet,TreeSet,Comparable,Comparator),Map容器(HashMap,TreeMap,EnumMap),反射(类对象,构造器,属性,方法,注解,泛型),动态编译,动态运行等。

周航宇的博客 1400

Java学习笔记 13 Java 集合 Collection 基本介绍

本篇博客主要就是介绍Java中集合大家族的成员,有常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等等! 一、Collection接口 Collection接口是最基本的集合接口,它不提供直接的实现,Java SDK提供的类都是继承自Collectio

JackZhangNJU的专栏 307

自学java第五天-集合框架(目标一个月找到工作)

集合框架:认识集合、Collection单列集合: (Collection集合的接口和实现、Collection遍历方式、List、Set) Collection双列集合:(Map集合)、Stream流、方法中可变参数、Collections工具类、小案例-斗地主

sinat_41703314的博客 391

【java基础核心大总结(八)】

集合 集合在我们的日常开发中所使用的次数简直太多了,你已经把它们都用的熟透了,但是作为一名合格的程序员,你不仅要了解它的基本用法,你还要了解它的源码;存在即合理,你还要了解它是如何设计和实现的,你还要了解它的衍生过程。 这篇博客就来详细介绍一下 Collection 这个庞大集合框架的家族体系和成员,让你了解它的设计与实现。 是时候祭出这张神图了 首先来介绍的就是列表爷爷辈儿的接口- Iterator Iterable 接口 实现此接口允许对象成为 for-each 循环的目标,也就是增强 for 循环,

hub666的博客 363
上一篇: Collection容器家族(LinkedHashSet源码详解)
下一篇: 浅谈Java设计模式——单例模式(SingleCase)
IdealSpring
博客等级 码龄8年 9粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值