首页 > 编程语言 >JDK源码分析-TreeSet

JDK源码分析-TreeSet

时间:2024-04-29 19:33:38浏览次数:22  
标签:return JDK 元素 TreeMap 源码 null public TreeSet

概述

TreeSet是Java集合框架中用于存储唯一元素的树形数据结构,它实现了NavigableSet接口,这意味着TreeSet中的元素不仅是有序的,还支持一系列的导航方法。

TreeSet的内部实现主要依赖于TreeMap,通过TreeMap的键来维护元素的排序。 

类图

从以上类图可以看到,TreeSet 实现了三个接口,继承了一个抽象类:

  • NavigableSet接口,提供了强大、灵活的排序与导航功能
  • Serializable接口,表示TreeSet支持序列化功能
  • Cloneable接口,表示TreeSet支持克隆
  • AbstractSet抽象类,主要提供元素对比、删除等操作

源码解读

成员变量

// 底层依赖TreeMap(TreeMap实现了NavigableMap接口)
private transient NavigableMap<E,Object> m;

// 同HashSet,value使用统一占位符对象
// value没有用到为啥不直接用null,因为底层TreeMap插入、移除元素会返回当前元素。如果这里使用null值,就无法判断是否插入、移除成功
private static final Object PRESENT = new Object();

构造方法

TreeSet 中提供了四种构造方案:

  • public TreeSet()默认构造函数
  • public TreeSet(Comparator<? super E> comparator)创建一个自定义比较器的TreeSet集合
  • public TreeSet(Collection<? extends E> c)创建一个包含集合c中所有元素的TreeSet集合
  • public TreeSet(SortedSet<E> s)创建一个包含SortedSet集合s中所有元素的TreeSet集合,且会复用s的比较器

添加元素

TreeSet的添加元素操作是通过调用TreeMap的put方法实现的。

public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}

与HashSet类似,如果元素不存在于TreeMap中,put方法会返回null,表示添加成功;如果元素已存在,则返回旧值(在这种情况下是PRESENT),表示添加失败。

删除元素

TreeSet的删除元素操作是通过调用TreeMap的remove方法实现的。

public boolean remove(Object o) {
    return m.remove(o)==PRESENT;
}

如果成功删除了元素,remove方法会返回PRESENT;否则返回null。

获取元素

TreeSet的获取元素操作是通过调用TreeMap方法实现的,获取TreeMap key即TreeSet的元素。

// 返回第一个元素
public E first() {
    return m.firstKey();
}
// 返回最后一个元素
public E last() {
    return m.lastKey();
}
// 返回set中小于e的最大的元素
public E lower(E e) {
    return m.lowerKey(e);
}
// 返回set中小于/等于e的最大元素
public E floor(E e) {
    return m.floorKey(e);
}
// 返回set中大于/等于e的最大元素
public E ceiling(E e) {
    return m.ceilingKey(e);
}
// 返回set中大于e的最小元素
public E higher(E e) {
    return m.higherKey(e);
}

遍历元素

TreeSet的遍历元素操作是通过调用TreeMap方法实现的。升序遍历(iterator方法)、降序遍历(descendingIterator方法)。

// 升序遍历
public Iterator<E> iterator() {
    return m.navigableKeySet().iterator();
}
// 降序遍历
public Iterator<E> descendingIterator() {
    return m.descendingKeySet().iterator();
}

出栈元素

TreeSet的出栈元素操作是通过调用TreeMap方法实现的。头结点出栈(pollFirst方法)、尾结点出栈(pollLast方法)。

// 获取TreeSet中第一个元素,并从Set中删除该元素
public E pollFirst() {
    Map.Entry<E,?> e = m.pollFirstEntry();
    return (e == null) ? null : e.getKey();
}
// 获取TreeSet中最后一个元素,并从Set中删除该元素
public E pollLast() {
    Map.Entry<E,?> e = m.pollLastEntry();
    return (e == null) ? null : e.getKey();
}

总结

通过以上的源码分析,可以看到TreeSet的底层实现主要依赖于TreeMap。TreeSet利用TreeMap的键来存储元素,并通过TreeMap的排序特性保证了元素的自然排序或自定义排序。

 

标签:return,JDK,元素,TreeMap,源码,null,public,TreeSet
From: https://www.cnblogs.com/grassLittle/p/18163860

相关文章

  • Linux内核源码-存储驱动之 QSPI Flash
    传输方式DIO/QIO/DOUT/QPIQPI模式(QuadPeripheralInterface),所有阶段都通过4线传输。与之相对的是SPI。SPI模式:纯种SPI(MISO/MOSI两个数据线)DOUT全称DualI/O,命令字和地址字均为单线,仅在数据阶段为双线。QOUT全称QuadI/O,命令字和地址字均为单线,仅在数据阶段为双线......
  • 大厂50万节点监控系统架构设计&Prometheus底层源码级剖析
    大厂50万节点监控系统架构设计&Prometheus底层源码级剖析 设计和实现一个大规模监控系统需要深入考虑架构设计、可伸缩性、性能优化等方面。下面是一个关于大规模监控系统架构设计的简要指南,以及有关Prometheus底层源码的剖析:大规模监控系统架构设计:1.架构设计原......
  • Prometheus源码解读系列 prometheus---告警处理源码剖析
    一、Target数据采集scrape模块解读1、scrapetarget业务流程框架1、由scrape.Manager管理所有的抓取对象;2、所有的抓取对象按group分组,每个group是一个job_name;3、每个group下含多个scrapeTarget,即具体的抓取目标endpoint;4、对每个目标endpoint,启动一个抓取goroutine,按照......
  • LruCache源码解析
    最近被问到LruCache原理一直觉得很简单的东西猛然一想,卧槽忘了,赶紧翻开源码瞧瞧!1、首先构造lrucache的时候会新建一个linkedHashMap来作为存储容器publicLruCache(intmaxSize){if(maxSize<=0){thrownewIllegalArgumentException("maxSize<=......
  • JDK源码分析-HashSet
    概述HashSet是Java集合框架中非常重要的一个类,它实现了Set接口,不允许出现重复元素,并且元素是无序的。HashSet的底层实现主要依赖于HashMap,通过HashMap来存储元素。如果想要了解HashMap,可以查看后续文章。类图从以上类图可以看到,HashSet实现了三个接口,继承了一个抽象类:Serial......
  • RocketMQ生产者启动源码
    核心代码初始化Default生产者DefaultMQProducerproducer=newDefaultMQProducer(PRODUCER_GROUP);设置NameAddr地址producer.setNamesrvAddr(DEFAULT_NAMESRVADDR);producer.start();分析newDefaultMQProducer(PRODUCER_GROUP)publicDefaultMQProducer(finalStringp......
  • Linux安装jdk的详细步骤
    jdkhttps://blog.csdn.net/qq_41694906/article/details/126372085通过Xftp把jdk安装包上传到linux服务器解压jdk命令tar-zxvfjdk-8u341-linux-x64.tar.gz配置环境变量vim/etc/profileexportJAVA_HOME=/opt/jdk1.8.0_341   (的地址需要修改)exportPATH=$JAVA_HOM......
  • jdk17对比jdk8
    Lambda表达式/***Lambda表达式*/privatestaticvoidlambda(){//JDK8List<Integer>list=Arrays.asList(1,2,3,4,5);list.forEach(n->System.out.println(n));//JDK17List<Integer&g......
  • DRF源码汇总
    DRF源码汇总【一】三大认证【1】认证【2】权限【3】频率【3.1】SimpleRateThrottle源码分析【二】JWT【1】simple-jwt【1.1】登录【1.2】认证......
  • ubuntu18源码安装postgresql15.2数据库
    由于官方的源只能安装到pg10这个版本,整了好一会没有成功就改为源码安装了。下载源代码源码并解压wgethttps://ftp.postgresql.org/pub/source/v15.2/postgresql-15.2.tar.gztar-xfpostgresql-15.2.tar.gzcdpostgresql-15.2/安装C++相关开发库和编译工具aptinst......