Java中TreeSet的基本介绍,细节讨论,使用注意事项,常用方法,底层源码分析

这篇具有很好参考价值的文章主要介绍了Java中TreeSet的基本介绍,细节讨论,使用注意事项,常用方法,底层源码分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TreeSet 是 Java 中的一个有序集合实现,它基于红黑树数据结构来存储元素,可以保持元素的自然顺序(默认情况下升序)或者根据自定义比较器来进行排序。下面是关于 TreeSet 的基本介绍、细节讨论、使用注意事项、常用方法以及一些底层实现细节。

基本介绍:

  • TreeSetSet 接口的实现类,它实现了一个有序的、无重复元素的集合。
  • TreeSet 中的元素是按照其自然顺序或者比较器的顺序进行排序的
  • TreeSet 不允许存储重复的元素,每个元素在集合中只能出现一次。

细节讨论:

  • TreeSet 会根据元素的自然顺序或者自定义的比较器来进行排序。如果元素没有实现 Comparable 接口并且没有提供比较器,会在运行时抛出 ClassCastException
  • 添加、删除和查找操作的时间复杂度平均为 O(log n),其中 n 是集合的大小。
  • TreeSet 不是线程安全的,如果在多线程环境下使用,需要进行适当的同步控制。

使用注意事项:

  • 在使用 TreeSet 时,元素需要具有可比较性(可以用instanceOf作为防护机制),要么实现 Comparable 接口,要么在构造 TreeSet 时提供一个比较器。
  • 自然顺序是指元素的默认顺序,如数字的升序、字符串的字典序等。如果需要不同的顺序,可以通过比较器来实现

常用方法:

  • add(E e): 向集合中添加一个元素。
  • remove(Object o): 从集合中移除指定的元素。
  • contains(Object o): 判断集合是否包含指定的元素。
  • isEmpty(): 判断集合是否为空。
  • size(): 返回集合中元素的数量。
  • clear(): 清空集合中的所有元素。

底层源码和底层实现:

  • TreeSet 的底层基于红黑树(Red-Black Tree)数据结构来存储元素。红黑树是一种自平衡的二叉查找树,确保树的高度始终保持在一个相对较小的范围内,从而保证了添加、删除和查找操作的高效性能。
  • 红黑树的特性使得元素在树中按照顺序排列,从而实现了 TreeSet 的有序性。
  • 通过自平衡的操作,红黑树能够在插入和删除元素时自动进行树的重新平衡,从而保持树的结构稳定。

总之,TreeSet 提供了一个有序的集合实现,通过底层的红黑树数据结构实现了高效的元素存储、添加、删除和查找操作。在需要保持顺序的集合场景下,可以使用 TreeSet

TreeSet的底层代码分析:文章来源地址https://www.toymoban.com/news/detail-677661.html

public class TreeSet_ {
    public static void main(String[] args) {
        //1. 当我们使用无参构造器,创建 TreeSet 时,仍然是无序的(存进去的和取出来的顺序不一样),但是取出来的顺序是按自然顺序排序的(自然顺序是指元素的默认顺序,如数字的升序、字符串的字典序等)
        //2. 如果需要不同的顺序,可以通过比较器来实现。如:希望添加的元素,按照字符串的长度来排序
        //3. 使用 TreeSet 提供的一个构造器,可以传入一个比较器(匿名内部类)
        // 并指定排序规则
        //简单看看源码
        /*
        1. 构造器把传入的比较器对象,赋给了 TreeSet 的底层的 TreeMap 的属性 this.comparator
        public TreeMap(Comparator < ? super K > comparator) {
            this.comparator = comparator;
        }
        2. 在 调用 treeSet.add("tom"), 在底层会执行到
        if (cpr != null) {//cpr 就是我们的匿名内部类(对象)
            do {
                parent = t;
                //动态绑定到我们的匿名内部类(对象)compare
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else //如果相等,即返回 0,这个 Key 就没有加入
                    return t.setValue(value);
            } while (t != null);
        }
        */
//         TreeSet treeSet = new TreeSet();//默认自然排序
        TreeSet treeSet = new TreeSet(new Comparator() {//自定义排序
            @Override
            public int compare(Object o1, Object o2) {
                //下面 调用 String 的 compareTo 方法进行字符串大小比较
                //让加入的元素,按照长度大小排序
                //return ((String) o2).compareTo((String) o1);
                return ((String) o1).length() - ((String) o2).length();
            }
        });
        //添加数据. treeSet.add("jack");

        treeSet.add("ret");//3
        treeSet.add("ret1");
        treeSet.add("a");
        treeSet.add("abc");//3此时这个加不进去,因为此时是按字符串的长度来排序的,长度和tom相同都为3,但若是在自然排序下是可以插入进去的,因为默认的情况下是比较的两个字符串是否一样而不是比较的长度
        System.out.println("treeSet=" + treeSet);
    }
}

到了这里,关于Java中TreeSet的基本介绍,细节讨论,使用注意事项,常用方法,底层源码分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RabbitMQ基本使用及企业开发中注意事项

    目录 一、基本使用 二、使用注意事项 1. 生产者重连机制 - 保证mq服务是通的 2. 生产者确认机制 - 回调机制 3. MQ的可靠性 4. Lazy Queue模式 5. 消费者确认机制 部署完RabbitMQ有两种使用方式: 网页客户端 Java代码 MQ组成部分: 虚拟主机 - 进行数据隔离的,好比mysql中的不同数据库

    2024年04月26日
    浏览(40)
  • flink中checkpoint重点介绍及生产上使用注意事项

    1、介绍 Flink Checkpoint 是 Apache Flink 提供的一种容错机制,用于保证在系统故障时数据的一致性和可靠性。 2、Flink Checkpoint内容拆分 Checkpoint 是什么? Checkpoint 是将应用程序中的状态信息(包括操作符状态、键值状态等)定期保存到持久化存储介质中的过程。它可以将整个应用

    2024年02月13日
    浏览(40)
  • 【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项

      CMSIS (微控制器 软件接口标准 ):Cortex Microcontroller Software Interface Standard,是由ARM和与其合作的芯片厂商( 比如ST、NXP公司等 )、软件工具厂商( Keil、IAR公司等 ),共同制定的标准。 如果没有此标准,ARM公司的产品兼容性非常差。   下图中分为三层,第一层是用户层

    2024年02月11日
    浏览(52)
  • 【TreeSet】| 深度剥析Java SE 源码合集Ⅳ

    TreeSet是基于红黑树实现的Set集合,它具有以下特点: 有序性:TreeSet是有序的,它按照元素的自然排序进行排序,或者按照指定的Comparator进行排序。 不允许重复元素:与HashSet一样,TreeSet也不允许重复元素,如果试图将一个已经存在的元素添加到TreeSet中,那么添加操作将会

    2023年04月17日
    浏览(44)
  • 49天精通Java,第24天,Java链表、散列表、HashSet、TreeSet

    大家好,我是哪吒。 从数组中间删除一个元素开销很大,其原因是向数组中插入元素时,此元素之后的所有元素都要向后端移动,删除时也是,数组中位于被删除元素之后的所有元素都要向数组的前端移动。 此时,在Java中,可以通过链表解决这个问题。 数组是在连续的存储

    2023年04月08日
    浏览(38)
  • java基础之set集合练习(HashSet,LinkedHashSet,TreeSet)

    Collection 接口的特点是     存放list与set共性内容 没有直接实现类  没有明确的存储特点要求           ; Set 接口的特点是元素 无 (有|无)顺序,不可   (可以|不可以)重复; A.可以利用Set 创建集合对象,存储多个对象 B.可以利用下标操作集合中的数据 C.Set 集合中所

    2024年01月23日
    浏览(52)
  • java中interface的使用以及注意事项

    一、接口(interface)基本概念 接口(interface):是java中一种引用数据类型,可以看做方法的集合,其内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法(JDK 9). 二、使用格式   1.定义格式:   public interface 接口名称{     //抽象方法    

    2024年02月06日
    浏览(30)
  • 【Java 基础篇】深入理解Java HashMap:使用注意事项和性能优化

    Java是一种广泛使用的编程语言,而集合是Java编程中不可或缺的一部分。在Java的集合框架中,HashMap是一个常用的数据结构,用于存储键值对。本文将深入介绍HashMap集合,从基础到高级用法,帮助您更好地理解和利用它。 HashMap是Java集合框架中的一个类,它实现了 Map 接口,用

    2024年02月06日
    浏览(36)
  • java中的String使用注意事项、StringBuilder、StringBuffer、StringJoiner

    String使用注意事项 这里第二次创造了0个对象是因为字符串常量池中已经有\\\"abc\\\" StringBuilder 注意StringBuilder支持链式编程 StringBuilder 线程安全与不安全的区别在于,当系统里存在很多人同时操作同一个StringBuilder就可能出bug,而StringBuilder不会。 StringJoiner

    2024年02月12日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包