TreeSet 源码解析

1、简述
  • TreeSet 底层是采用 TreeMap 实现的一种 Set 集合。
2、归纳
  • 继承于 AbstractSet 抽象类,实现了 NavigableSet 接口。
  • 实现了 Cloneable 和 Serializable 接口,所以支持复制(拷贝)、序列化。
  • 底层默认基于 TreeMap 实现的,无序,不可重复,不允许 null 的存在。
  • 单线程安全,多线程不安全。
3、分析
  • 由于 TreeSet 源码较小,主要功能都在 TreeMap 类已经实现,所以咱们直接看源码。
public class TreeSet<E> extends AbstractSet<E>
        implements NavigableSet<E>, Cloneable, java.io.Serializable {

    // 序列化唯一表示 UID
    private static final long serialVersionUID = -2479143000061671589L;

    // 元素存储在 NavigableMap 中
    // 注意它不一定就是 TreeMap
    private transient NavigableMap<E, Object> m;

    // 虚拟元素, 用来作为 value 存储在 map 中
    private static final Object PRESENT = new Object();

    /**
     * 无参构造函数
     * 默认使用 TreeMap 初始化
     */
    public TreeSet() {
        this(new TreeMap<E, Object>());
    }

    /**
     * 有参构造函数
     * 直接使用传进来的 NavigableMap 存储元素
     * 这里不是深拷贝,如果外面的 map 有增删元素也会反映到这里
     * 而且, 这个方法不是 public 的, 说明只能给同包使用
     *
     * @param m NavigableMap 集合
     */
    TreeSet(NavigableMap<E, Object> m) {
        this.m = m;
    }

    /**
     * 有参构造函数
     * 将集合 c 中的所有元素添加的 TreeSet 中
     *
     * @param c Collection 集合
     */
    public TreeSet(Collection<? extends E> c) {
        this();
        addAll(c);
    }

    /**
     * 有参构造函数
     * 使用带 comparator 的 TreeMap 初始化
     *
     * @param comparator 比较器
     */
    public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }

    /**
     * 将 SortedSet 中的所有元素添加到 TreeSet 中
     *
     * @param s SortedSet集合
     */
    public TreeSet(SortedSet<E> s) {
        this(s.comparator());
        addAll(s);
    }

    /**
     * 升序迭代器
     *
     * @return 返回升序迭代器
     */
    public Iterator<E> iterator() {
        return m.navigableKeySet().iterator();
    }

    /**
     * 降序迭代器
     *
     * @return 返回降序迭代器
     */
    public Iterator<E> descendingIterator() {
        return m.descendingKeySet().iterator();
    }

    /**
     * 以降序返回一个新的 TreeSet 集合
     *
     * @return 返回 TreeSet 集合
     */
    public NavigableSet<E> descendingSet() {
        return new TreeSet<>(m.descendingMap());
    }

    /**
     * 元素的个数
     *
     * @return 返回元素个数
     */
    public int size() {
        return m.size();
    }

    /**
     * 判断是否为空
     *
     * @return true 代表为空,false 代表不为空
     */
    public boolean isEmpty() {
        return m.isEmpty();
    }

    /**
     * 判断是否包含某元素
     *
     * @param o 元素值
     * @return true 代表包含,false 代表不包含
     */
    public boolean contains(Object o) {
        return m.containsKey(o);
    }

    /**
     * 添加元素
     *
     * @param e 元素值
     * @return true 代表添加成功,false 代表添加失败
     */
    public boolean add(E e) {
        // 元素值作为 key,所以不可重复,不可为 null
        return m.put(e, PRESENT) == null;
    }

    /**
     * 删除元素
     *
     * @param o 元素值
     * @return true 代表删除成功,false 代表删除失败
     */
    public boolean remove(Object o) {
        return m.remove(o) == PRESENT;
    }

    /**
     * 清空所以的元素
     */
    public void clear() {
        m.clear();
    }

    /**
     * 添加集合 c 中的所有元素
     *
     * @param c Collection 集合
     * @return true 代表添加成功,false 代表添加失败
     */
    public boolean addAll(Collection<? extends E> c) {
        // 满足一定条件时直接调用 TreeMap的addAllForTreeSet() 方法添加元素
        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);
                return true;
            }
        }
        // 不满足上述条件, 调用父类的 addAll() 通过遍历的方式一个一个地添加元素
        return super.addAll(c);
    }

    /**
     * 子 set(NavigableSet 中的方法)
     *
     * @param fromElement
     * @param fromInclusive
     * @param toElement
     * @param toInclusive
     * @return 返回 NavigableSet 集合
     */
    public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
                                  E toElement, boolean toInclusive) {
        return new TreeSet<>(m.subMap(fromElement, fromInclusive,
                toElement, toInclusive));
    }

    /**
     * 头 set(NavigableSet 中的方法)
     *
     * @param toElement
     * @param inclusive
     * @return 返回 NavigableSet 集合
     */
    public NavigableSet<E> headSet(E toElement, boolean inclusive) {
        return new TreeSet<>(m.headMap(toElement, inclusive));
    }

    /**
     * 尾 set(NavigableSet 中的方法)
     *
     * @param fromElement
     * @param inclusive
     * @return 返回 NavigableSet 集合
     */
    public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
        return new TreeSet<>(m.tailMap(fromElement, inclusive));
    }

    /**
     * 子 set(SortedSet 接口中的方法)
     *
     * @param fromElement
     * @param toElement
     * @return 返回 SortedSet 集合
     */
    public SortedSet<E> subSet(E fromElement, E toElement) {
        return subSet(fromElement, true, toElement, false);
    }

    /**
     * 头 set(SortedSet 接口中的方法)
     *
     * @param toElement
     * @return 返回 SortedSet 集合
     */
    public SortedSet<E> headSet(E toElement) {
        return headSet(toElement, false);
    }

    /**
     * 尾 set(SortedSet 接口中的方法)
     *
     * @param fromElement
     * @return 返回 SortedSet 集合
     */
    public SortedSet<E> tailSet(E fromElement) {
        return tailSet(fromElement, true);
    }

    /**
     * 比较器
     *
     * @return 返回比较器
     */
    public Comparator<? super E> comparator() {
        return m.comparator();
    }

    /**
     * 返回最小的元素
     *
     * @return 返回最小的元素
     */
    public E first() {
        return m.firstKey();
    }

    /**
     * 返回最大的元素
     *
     * @return 返回最大的元素
     */
    public E last() {
        return m.lastKey();
    }

    /**
     * 返回小于 e 的最大的元素
     *
     * @param e 元素值
     * @return 返回小于 e 的最大的元素
     */
    public E lower(E e) {
        return m.lowerKey(e);
    }

    /**
     * 返回小于等于 e 的最大的元素
     *
     * @param e 元素值
     * @return 返回小于等于 e 的最大的元素
     */
    public E floor(E e) {
        return m.floorKey(e);
    }

    /**
     * 返回大于等于 e 的最小的元素
     *
     * @param e 元素值
     * @return 返回大于等于 e 的最小的元素
     */
    public E ceiling(E e) {
        return m.ceilingKey(e);
    }

    /**
     * 返回大于 e 的最小的元素
     *
     * @param e 元素值
     * @return 返回大于 e 的最小的元素
     */
    public E higher(E e) {
        return m.higherKey(e);
    }

    /**
     * 弹出最小的元素
     *
     * @return 弹出最小的元素
     */
    public E pollFirst() {
        Map.Entry<E, ?> e = m.pollFirstEntry();
        return (e == null) ? null : e.getKey();
    }

    /**
     * 弹出最大的元素
     *
     * @return 弹出最大的元素
     */
    public E pollLast() {
        Map.Entry<E, ?> e = m.pollLastEntry();
        return (e == null) ? null : e.getKey();
    }

    /**
     * 克隆方法
     *
     * @return 返回克隆后的 Object 对象
     */
    @SuppressWarnings("unchecked")
    public Object clone() {
        TreeSet<E> clone;
        try {
            clone = (TreeSet<E>) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e);
        }

        clone.m = new TreeMap<>(m);
        return clone;
    }

    /**
     * 序列化写出方法
     *
     * @param s
     * @throws java.io.IOException
     */
    private void writeObject(java.io.ObjectOutputStream s)
            throws java.io.IOException {
        // Write out any hidden stuff
        s.defaultWriteObject();

        // Write out Comparator
        s.writeObject(m.comparator());

        // Write out size
        s.writeInt(m.size());

        // Write out all elements in the proper order.
        for (E e : m.keySet())
            s.writeObject(e);
    }

    /**
     * 序列化写入方法
     *
     * @param s
     * @throws java.io.IOException
     * @throws ClassNotFoundException
     */
    private void readObject(java.io.ObjectInputStream s)
            throws java.io.IOException, ClassNotFoundException {
        // Read in any hidden stuff
        s.defaultReadObject();

        // Read in Comparator
        @SuppressWarnings("unchecked")
        Comparator<? super E> c = (Comparator<? super E>) s.readObject();

        // Create backing TreeMap
        TreeMap<E, Object> tm = new TreeMap<>(c);
        m = tm;

        // Read in size
        int size = s.readInt();

        tm.readTreeSet(size, s, PRESENT);
    }

    /**
     * 可分割的迭代器
     *
     * @return 返回可分割的迭代器
     */
    public Spliterator<E> spliterator() {
        return TreeMap.keySpliteratorFor(m);
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java版本phpmyadmin,java数据库管理,web版数据库维护。 本系统使用JAVA开发,采用稳定通用的springMVC +JDBC架构,实现基于WEB方式对数据库进行维护。 功能包括:数据库的展示,库表的展示,表字段结构的展示, SQL语句的在线编辑批量执行,表结构的在线设计维护,数据的在线编辑维护,查询语句保存,SQL语法帮助,在线数据源选择配置等。 系统内置14套UI皮肤,45套代码编辑区UI方案,使用中可以依个人喜好选择配色方案。 本系统不但稳定,实用,功能强大,交互友好,而且还很好玩,可自由组合各种色彩,让维护数据库成为一件舒心的事情。 功能介绍: 1、在SQL编辑区可直接编辑语句,对数据库进行操作维护。支持多语句批量执行,支持选择执行,支持关键字高亮提示,支持多结果展示。 2、选择左侧库表后,将直接查询表数据,并展示出来。可通过新增、编辑、删除按钮对表数据进行维护。也可直接双击行,进行数据编辑,操作十分方便。 3、通过点击“设计”按钮,将切换到表结构设计页,您可以方便的增加、修改、删除表字段,调整字段顺序,设置主键,设置非空等操作。 4、当你编辑了许多SQL语句后,可点击”SQL保存”按钮,保存自己的劳动成果,通过右侧“我的SQL”列表,可查询到保存记录。 5、系统内置14套UI皮肤,45套代码编辑区UI方案, 可自由设置组合,深色的屏幕有助保护视力。 福州青格软件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值