深入理解Java TreeSet:实现与使用案例分析

哈喽,各位小伙伴们,你们好呀,我是喵手。

今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

如下是Java集合体系架构图,近期几期内容都是围绕该体系进行知识讲解,以便于同学们学习Java集合篇知识能够系统化而不零散。

前言

在Java中,有很多常用的数据结构,例如List、Set、Map等,这些数据结构都是为了方便程序员的数据管理而存在的。而TreeSet作为Set的一种实现方式,它的底层实现是基于红黑树的。

摘要

本文将对Java中的TreeSet进行详细介绍,包括其底层实现原理、应用场景案例、优缺点分析、类代码方法介绍、以及测试用例等内容,旨在帮助读者更好地了解和使用TreeSet。

TreeSet类

简介

TreeSet是Java中的一个基于红黑树实现的有序集合,它实现了NavigableSet接口和SortedSet接口。与HashSet不同,TreeSet中的元素是有序的,且不允许存在重复元素。在TreeSet中,元素按照指定顺序进行存储,并且可以在O(log(n))时间复杂度内实现插入、查找、删除等操作。TreeSet可以对元素进行自然排序或者指定排序方式。

源代码解析

TreeSet的底层实现是基于红黑树的,红黑树是一种自平衡的二叉搜索树。红黑树的每个节点都具有一个颜色属性,为红色或黑色。在插入与删除节点的过程中,通过改变颜色和旋转节点来保持红黑树的平衡。红黑树的所有操作都可以在O(log(n))时间复杂度内完成。

TreeSet中的add()方法实现了对元素的插入操作,它首先调用红黑树的插入方法,在插入节点时会进行颜色调整和旋转操作,保持红黑树的平衡性。TreeSet中的remove()方法实现了对元素的删除操作,也会进行颜色调整和旋转操作来保持红黑树的平衡。

如下是Java TreeSet 是一种基于红黑树实现的集合,具有以下特点:

1.元素自动排序:TreeSet 中的元素会自动按照其自然顺序进行排序;或者按照构造 TreeSet 时传入的 Comparator 进行排序。

  1. 线程不安全:TreeSet 并不是线程安全的。

  2. 支持高效的插入、删除、查找操作:由于底层是基于红黑树实现,因此这些操作的时间复杂度为 O(logN)。

下面,我们来看一下 TreeSet 的源代码实现。

  1. 数据结构

TreeSet 的底层实现是一个基于 TreeMap 的映射,其中键就是 TreeSet 中的元素,值则是一个固定的 Object 对象。因为 TreeMap 是基于红黑树实现的,所以 TreeSet 中的元素也具有自动排序的特点。

  1. 构造函数

TreeSet 有多个构造函数,其中最常用的是无参构造函数和一个 Comparator 类型的参数构造函数。

无参构造函数:

java 复制代码
public TreeSet() {
    this(new TreeMap<>());
}

该构造函数会新建一个基于 TreeMap 的映射。

带 Comparator 参数的构造函数:

java 复制代码
public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}

该构造函数会新建一个基于 TreeMap 的映射,并且使用传入的 Comparator 进行元素排序。

  1. 插入元素

TreeSet 的插入元素操作是基于 TreeMap 的 put() 方法实现的,具体实现代码如下:

java 复制代码
public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}

其中,PRESENT 是一个固定的 Object 对象,用于作为 TreeMap 的 value。

当插入一个新元素时,如果 TreeMap 中已经存在相同的元素,则会更新该元素的 value 值,并且返回 false;否则,将新元素插入到 TreeMap 中,并且返回 true。

  1. 删除元素

TreeSet 的删除元素操作也是基于 TreeMap 的 remove() 方法实现的,具体实现代码如下:

java 复制代码
public boolean remove(Object o) {
    return m.remove(o)==PRESENT;
}

该方法会将 TreeMap 中键为 o 的元素删除,并且返回该元素对应的 value 值。如果该 value 值为 PRESENT,则表示 TreeMap 中原来确实存在这个元素,删除该元素成功,并且返回 true;否则返回 false。

  1. 遍历元素

TreeSet 提供了多种遍历元素的方式,包括迭代器、forEach() 方法等。其中, 迭代器遍历的顺序是按照元素的自然顺序或者 Comparator 的顺序进行的。

源代码部分截图:

总之,Java TreeSet 是一个基于红黑树实现的集合,具有元素自动排序、线程不安全、支持高效的插入、删除、查找等操作的特点。在实现过程中,TreeSet 底层是基于 TreeMap 进行数据存储与操作的。如果需要存储有序的元素,或者进行快速的插入、删除、查找等操作,可以使用 Java TreeSet。

应用场景案例

TreeSet的有序性和快速查找的特点使得它在很多场景下都可以发挥重要作用,例如:

  1. 排序数据:TreeSet可以对元素进行自然排序或者指定排序方式,因此可以非常方便地对数据进行排序操作。
  2. 去重数据:TreeSet中不允许存在重复元素,因此可以用来去重。
  3. 优先级队列:TreeSet可以实现一个优先级队列,在优先级队列中,元素按照指定顺序进行存储,并且可以在O(log(n))时间复杂度内实现插入、查找、删除等操作。

优缺点分析

TreeSet作为一种基于红黑树实现的有序集合,具有以下优缺点:

优点

  1. 元素有序:TreeSet中的元素是有序的,可以进行自然排序或者指定排序方式。
  2. 快速查找:在TreeSet中进行查找操作的时间复杂度为O(log(n)),因此查找速度非常快。
  3. 去重数据:TreeSet中不允许存在重复元素,可以用来去重。

缺点

  1. 空间开销大:TreeSet的底层实现是基于红黑树的,因此需要额外的空间存储树的结构,导致空间开销较大。
  2. 插入、删除操作慢:虽然在TreeSet中进行查找操作的时间复杂度为O(log(n)),但是插入、删除操作的时间复杂度也是O(log(n)),因此在频繁进行插入、删除操作时,性能可能不如HashSet等数据结构。

类代码方法介绍

方法一:add()

java 复制代码
public boolean add(E e)

方法说明:

向TreeSet中添加一个元素。

参数说明:

  • e:要添加的元素。

返回值:

  • 如果插入成功返回true,否则返回false。

方法二:remove()

java 复制代码
public boolean remove(Object o)

方法说明:

TreeSet中删除指定元素。

参数说明:

  • o:要删除的元素。

返回值:

  • 如果删除成功返回true,否则返回false。

方法三:iterator()

java 复制代码
public Iterator<E> iterator()

方法说明:

返回一个迭代器,用于遍历TreeSet中的元素。

返回值:

  • 返回一个迭代器,用于遍历TreeSet中的元素。

测试用例

用例代码

如下通过使用TreeSet来给大家做个演示:代码如下:

java 复制代码
package com.example.javase.collection;

import java.util.Iterator;
import java.util.TreeSet;

/**
 * @Author ms
 * @Date 2023-10-24 21:23
 */
public class TreeSetTest {

    public static void main(String[] args) {
        TreeSet<String> set = new TreeSet<>();

        // 添加元素
        set.add("apple");
        set.add("banana");
        set.add("orange");
        set.add("pear");
        set.add("grape");
        set.add("watermelon");

        // 输出元素
        System.out.println("TreeSet中的元素为:");
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println();

        // 删除元素
        set.remove("orange");

        // 输出元素
        System.out.println("删除元素后,TreeSet中的元素为:");
        iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println();
    }
}

测试结果

输出结果:

java 复制代码
TreeSet中的元素为:
apple banana grape orange pear watermelon 
删除元素后,TreeSet中的元素为:
apple banana grape pear watermelon 

结果截图如下:

测试代码分析

这段代码演示了如何使用Java中的TreeSet类,实现了向集合中添加元素、输出元素、删除元素等基本操作。

首先,创建了一个String类型的TreeSet对象set,并向其中添加了多个元素,即"apple"、"banana"、"orange"、"pear"、"grape"、"watermelon"。

然后,利用迭代器遍历输出set中的元素,其中利用了hasNext()next()方法。

接着,从set中删除了一个元素"orange"。

最后,再次利用迭代器遍历输出set中的元素,查看删除操作是否生效。

全文小结

本文主要介绍了Java中的TreeSet,包括其底层实现原理、应用场景案例、优缺点分析、方法介绍以及测试用例等内容。通过本文的阅读,读者可以更好地了解并使用TreeSet。

总结

本文主要介绍了Java中的TreeSet类,包括其底层实现原理、应用场景案例、优缺点分析、方法介绍以及测试用例等内容。通过本文的介绍,我们了解到TreeSet是一种基于红黑树实现的有序集合,具有元素有序、快速查找、去重数据等优点,可以应用到很多场景中。但是,由于TreeSet的底层实现是基于红黑树的,因此在插入、删除操作上可能不如HashSet等数据结构。因此,在使用TreeSet时,需要根据具体场景来选择。

本文还通过测试用例的方式,演示了如何使用Java中的TreeSet类,实现了向集合中添加元素、输出元素、删除元素等基本操作。通过测试代码的分析,读者可以更好地了解使用TreeSet的具体方法。

综上所述,通过本文的阅读,读者可以更好地了解并使用TreeSet,从而提高Java编程的效率和质量。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

相关推荐
一只叫煤球的猫41 分钟前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9651 小时前
tcp/ip 中的多路复用
后端
bobz9651 小时前
tls ingress 简单记录
后端
皮皮林5512 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友2 小时前
什么是OpenSSL
后端·安全·程序员
bobz9653 小时前
mcp 直接操作浏览器
后端
前端小张同学5 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook5 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康6 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在6 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net