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 }