集合框架Set之TreeSet

TreeSet Set 接口的一种实现类 它的底层实现是基于TreeMap(底层实现的数据结构是树结构,并不是由TreeMap实现)
它的内部存储时是有序的,使其有序的方法是compareTo(),每次存储时都会调用被存储对象的compareTo()与已经存在的对象做比较,如果返回值为0则代表两个
对象相等,则此对象不会被存入到set中,(基本数据类型比较的是真实值,但自己写的类则是比较的地址,如果想要按他们的真实值进行比较则需要自己重写compareTo方法)

重写compareTo()方法需要实现接口Comparable

此实现提供了基本的操作(保证的log(n)时间成本add, remove和contains)。

需要注意的是由一组(无论是否提供了明确的比较器)保持的顺序必须与equals一致

,如果它是要正确实现Set接口。(参见Comparable或Comparator为一致的精确定义与equals)。这是因为该Set接口在来定义equals的操作,但一个TreeSet例如使用其执行所有元件比较compareTo(或compare)方法,于是两个通过该方法认为相等的元素从集合的角度来看是相等的。

集合的行为是明确定义的,即使其排序与equals不一致;它只是没有遵守Set界面的总体合同。

请注意,此实现不同步。

如果多个线程并发访问树,并且至少有一个线程修改该集合,则必须
在外部进行同步。

这通常通过在自然地封装集合的一些对象上进行同步来实现。
如果没有这样的对象存在,那么该集合应该使用Collections.synchronizedSortedSet方法“包装”。

这最好在创建时完成,以防止对该集合的意外不同步访问:

SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));

该类iterator方法返回的迭代器是故障快速的:如果在迭代器创建之后的任何时间对该集合进行了修改,除了通过迭代器自己的remove方法之外,迭代器将抛出一个ConcurrentModificationException。

请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。

因此,编写依赖于此异常的程序的正确性将是错误的:迭代器的故障快速行为应仅用于检测错误。
对于比较汉字时会出现故障所以用适用当前环境的类进行比较

Collator collator= Collator.getInstance();
CollationKey key = collator.getCollationKey(this.name);
CollationKey key2 = collator.getCollationKey(o.name);
int num = key.compareTo(key2);

public int compareTo(Person o) {
        
             // 需要有 两个条件
        //成绩   第一条件排序
        if(this.grade>o.grade){
            return -1;
        }else if(this.gradeo.age){
                return 1;
            }else if(this.age 

你可能感兴趣的:(集合框架Set之TreeSet)