This website requires JavaScript.

Java集合 TreeSet源码

通过TreeMap实现的有序的Set集合

在不传入Comparator,元素不实现Comparable接口的情况下,编译没问题,但是运行时会抛出异常

TreeSet treeSet = new TreeSet<Student>();
Student cannot be cast to class java.lang.Comparable

提供一个构造函数在创建时传入Comparator:

    public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }
        TreeSet treeSet = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge()-o2.getAge();
            }
        });

否则需要元素实现Comparable接口

内部使用NavigableMap存储,NavigableMap接口继承自SortedMap接口,提供有序的Map实现

另外,LinkedHashMap是通过内部添加两个属性after和before属性,维护一个链表来实现有序,sortedMap主要是使用Comparable和Comparator

    /**
     * The backing map.
     */
    private transient NavigableMap<E,Object> m;

treeSet的大多构造方法都是通过使用TreeMap的构造函数创建NavigableMap

public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}

public TreeSet() {
        this(new TreeMap<>());
}

上面都会调用下面的构造方法

TreeSet(NavigableMap<E,Object> m) {
    this.m = m;
}

通过SortedSet创建会使用它的构造函数创建TreeMap,在把SortedSet的元素添加到TreeMap中

public TreeSet(SortedSet<E> s) {
    this(s.comparator());
    addAll(s);
}

其他基本操作方法基本都是调用map的方法来使用

    public boolean add(E e) {
        return m.put(e, PRESENT)==null;
    }
    public boolean contains(Object o) {
        return m.containsKey(o);
    }
    public void clear() {
        m.clear();
    }
    public E first() {
        return m.firstKey();
    }
0条评论
avatar