Java集合框架之Set接口

 1.Set接口不记录元素添加顺序的误区

public  void setDemo(){
        Set<String> set1 = new HashSet<>();
        set1.add("London");
        set1.add("Chinese");
        set1.add("Shanghai");
        set1.add("England");
        set1.add("China");
     System.out.println(set1);

   }

输出结果为:[Shanghai, China, London, England, Chinese]

hashset 没有顺序的意思是实际上的顺序和插入顺序不一样。
比如,按照set.add(1);set.add(2);set.add(3);插入
输出顺序却可能是231
而不是说随机输出顺序。

-------------------------------------------------------------------------------------------

2.Java,子类不是必须重写父类所有方法的,分为以下两种情况:

1.父类方法为抽象方法时,子类必须重写(实现)所有父类的抽象方法;

 2.父类方法为普通方法时,子类可以重写父类方法,也可以不重写。

-------------------------------------------------------------------------------------------

3.TreeSet需要重写CompareTo方法 默认情况下进行自然排序。

 1 //用年龄进行排序
 2 class Person implements Comparable<Person> {
 3      String name;
 4      int age;
 5 
 6     public Person(String name, int age) {
 7         this.name = name;
 8         this.age = age;
 9     }
10 
11     @Override
12     public int compareTo(Person o) {
13         if (this.age > o.age) {
14             return 1;
15         } else if (this.age < o.age) {
16             return -1;
17         }
18         return 0;
19     }
20 
21     @Override
22     public String toString() {
23         return "Person [name=" + name + ", age=" + age + "]";
24     }
25     
26 }
27 
28 public class TreeSetDemo {
29     public static void main(String[] args) {
30         Set<Person> tree = new TreeSet<>();
31         tree.add(new Person("李白", 15));
32         tree.add(new Person("赵云", 17));
33         tree.add(new Person("关羽", 2));
34         tree.add(new Person("张飞", 16));
35         System.out.println(tree);

想了两天都没搞懂compareTo方法中形参Person o是哪里来的,下面的是我的猜想:

this指代当前对象,第一次插入时,成员变量 name和age分别被赋值为:李白和15,这时候this是指刚插入的李白,然而此时Person o对象不存在,所以不进行比较。

第二次插入"赵云"时,this指代赵云,o指代第一次插入的李白,以此类推,TreeSet会自动调用compareTo方法。

TreeSet会自动调用compareTo方法进行排序


 

自定义排序:(实现Comparator接口)(根据姓名的长度进行排序)

 1 class NameLengthComparator implements Comparator<Person> {
 2 
 3     @Override
 4     public int compare(Person o1, Person o2) {
 5         if(o1.name.length() > o2.name.length()) {
 6             return 1;
 7         }else if(o1.name.length() < o2.name.length()) {
 8             return -1;
 9         }
10         return 0;//返回0 两个对象指同一个对象
11     }
12     
13 }
14 public class TreeSetDemo {
15     public static void main(String[] args) {
16 
17         Set<Person> tree2 = new TreeSet<>(new NameLengthComparator());
18         tree2.add(new Person("李白123", 15));
19         tree2.add(new Person("赵云1", 17));
20         tree2.add(new Person("关羽", 2));
21         tree2.add(new Person("张飞252727", 16));
22         System.out.println(tree2);
23 
24     }
25 }
原文地址:https://www.cnblogs.com/AmosWong/p/9569305.html