(9)集合之Set,HashSet,TreeSet

TreeSet子类

注意事项:

1、TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储

2、TreeSet添加元素的时候,如果元素本身不具备自然顺序特性,该元素所属的类必须要实现Comparable接口(该接口只有一个compareTo方法),把元素的比较规则定义在compareTo(T o)方法上。

compareTo()方法负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。

3、如果比较元素的时候compareTo返回的是0的,那么该元素视作添加的是重复元素,set是去重的,多以就不允许添加进来。不去看equals也不看hashCode方法,看的是compareTo方法。

4、TreeSet添加元素的时候,如果元素本身没有具备自然序列的特性,而元素所属的类,也没有实现comparable接口,那么要在创建TreeSet的时候传入一个比较器。

5TreeSet添加元素的时候,如果元素本身不具备自然顺序特性,而元素所属的类已经实现了Comparable接口,再创建TreeSet的时候也传入了自定义个比较器,那么比较器的比较规则优先使用。

比较的工作是有TreeSet做的,但是做之前有要求,1、元素本身具有自然顺序的特性,2不具备自然特性,从两方面下手:2.1让元素实现Comparable接口,重写CompareTo方法,2.2set在创建的时候,给set传入一个比较器comparator

自定义比较器的格式:自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在compare()方法内即可

Class 类名 implements Comparator

{

}

TreeSet的存储原理:底层是使用红黑树(二叉树)数据结构实现的,而且这个二叉树是一个平衡二叉树(这样可以是比较的次数尽可能的少)。存储的规则是:左小右大。

推荐使用Comparator的比较器。为什么这样推荐那呢,Comparable接口,之内在实现该类的自定义类中使用,使用conparator接口的比较器,只要你设计的好,很多地方都可以使用,这样提高了代码的重用性。

 List的contain方法使用的是equals()方法

HashSet集合中则联合使用hashCode和equals方法。

TreeSet是在元素可比的前提下,使用的是Comparable或者Comparator中的compareTo方法

TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口的

这里说明一下,比较的主体是this

If(this > obj) return 1;

If (this < obj) return -1;

每个元素是一个Person,有姓名和年龄,按照年龄从小到达的顺序排列如果年龄相同的话,则在 比较姓名

 1 // Person实现Comparable接口
 2 @Override
 3     public int compareTo(Object o) {
 4         Person p = (Person) o;
 5         
 6         if(this.getAge() > p.getAge())
 7             return 1;
 8         if(this.getAge() < p.getAge())
 9             return -1;
10         return this.getName().compareTo(p.getName());
11     }
12 
13 // 自顶一个一个自己的比较器 
14 class MyComparator implemments Comparator
15 {
16   public int compareTo(Object 01, Object o2)
17   {
18     Person p1 = (Person) o1;
19     Person p2 = (Person) o2;
20 
21     if(p1.getAge() > p2.getAge()) return 1;
22     if(p1.getAge() < p2.getAge()) return -1;
23     return p1.getName().compareTo(p2.getName());
24   }    
25 }
原文地址:https://www.cnblogs.com/OliverZhang/p/6019329.html