zoukankan      html  css  js  c++  java
  • 集合系列 Set(七):TreeSet

    目录

    1 概述

    2 源码分析

     2.1 类成员变量

     2.2 构造方法

     2.3 核心方法

    3 总结

    1 概述

    TreeSet 是 Set 集合的红黑树实现,但其内部并没有具体的逻辑,而是直接使用 TreeMap 对象实现。我们先来看看 TreeSet 的定义。

    public class TreeSet<E> extends AbstractSet<E>
        implements NavigableSet<E>, Cloneable, java.io.Serializable

    可以看到 TreeSet 实现了 NavigableSet 接口,而 NavigableSet 接口又继承了 接口。SortedSet 接口又继承了 Set 接口。

    public interface NavigableSet<E> extends SortedSet<E>
    
    public interface SortedSet<E> extends Set<E> 

    TreeSet 的类继承关系如下图所示。

    2 源码分析

    2.1 类成员变量

    // 具体的实现类
    private transient NavigableMap<E,Object> m;
    // Map的value
    private static final Object PRESENT = new Object();

    2.2 构造方法

    TreeSet 一共有 5 个构造方法,如下所示:

    // 默认采用TreeMap实现
    public TreeSet() {
        this(new TreeMap<E,Object>());
    }
    // 指定实现类型
    TreeSet(NavigableMap<E,Object> m) {
        this.m = m;
    }
    // 指定TreeMap的比较器
    public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }
    // 指定初始集合
    public TreeSet(Collection<? extends E> c) {
        this();
        addAll(c);
    }
    // 指定比较器以及初始集合
    public TreeSet(SortedSet<E> s) {
        this(s.comparator());
        addAll(s);
    }

    可以看到,如果我们没有指定传入的 Map 类型,TreeSet 将自动采用 TreeMap 来实现。而如果你传入了 NavigableMap 类型的对象,那么就按照你传入的对象类型来实现。

    2.3 核心方法

    TreeSet 的核心方法实现直接采用了 TreeMap 的实现,无论是 add 还是 remove 方法。

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

    3 总结

    TreeSet 的实现与 HashSet 类似,都是直接采用了 TreeMap 的方法实现。所以如果理解了 TreeMap,那么 TreeSet 就很简单了。

     

  • 相关阅读:
    django之路由层(反向解析)总结
    django 路由层(反向解析)03
    Django 文件配置、pycharm及django连接数据库、表的增删改查 总结
    Django 之 文件配置、pycharm及django连接数据库、创表及表的增删改查02
    Django框架简介(1)
    编程语言类别;运行Python程序的方式;变量和常量;Python程序的垃圾回收机制;
    Python语法之垃圾回收机制
    前端js之BOM和DOM操作
    前端js之JQuery
    获取当前应用信息
  • 原文地址:https://www.cnblogs.com/youngao/p/12518230.html
Copyright © 2011-2022 走看看