目录
4.基于Compareable接口和基于比较器的比较的区别:
在Java中对象不能直接用'>'、'<'号进行比较,而'='号只能比较对象引用指向的空间是否是同一个,那么这时候就要将对象比较的方法进行覆写。
1.equals()方法的覆写
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
//如果是自己和自己比较
if (this == o) {
return true;
}
//如果o是空类型,且o不是Student类
if (o == null || o instanceof Student) {
return false;
}
//比较name和age的大小
Student s = (Student) o;
return this.name.equals(s.name) && this.age == s.age;
}
}
由于所有类的父类都是Object类,那么只要覆写Object类里的equals()方法就可以了。
2.基于Compareable接口的比较:
想要比较变量的大小,可以实现Compareable接口,覆写其中的compareTo方法。
class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//在这里我们认为o为null是最小的
//先比较name的大小,如果相同,再比较age的大小。
@Override
public int compareTo(Student o) {
if (o == null) {
return 1;
}
if (this.name.compareTo(o.name) != 0) {
return this.name.compareTo(o.name);
} else {
return this.age - o.age;
}
}
}
3.基于比较器的比较:
用户自定义比较器类,然后实现Comparator接口,覆写Comparator接口里的compare()方法:
class Student{
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
class StuComparator implements Comparator<Student> {
//我们同样认为null是最小的
//先比较name的大小,如果相同,再比较age的大小。
@Override
public int compare(Student o1, Student o2) {
if (o1 == null && o2 == null) {
return 0;
}
if (o1 == null && o2 != null) {
return -1;
}
if(o1 != null && o2 == null) {
return 1;
}
if (!o1.name.equals(o2.name)) {
return o1.name.compareTo(o2.name);
} else {
return o1.age - o2.age;
}
}
}
4.基于Compareable接口和基于比较器的比较的区别:
由于private修饰的变量只能在类中访问,那么我们基于比较器所比较的对象的变量不能是private修饰的:
因此可以得出结论:
1.基于Comparable接口需要在类内部覆写方法,侵入性比较强,一旦实现,每次使用类似PriorityQueue这种可以实现Comparable接口的集合时,每次使用该类都是基于覆写方法里实现的顺序,属于内部顺序。
2.基于比较器接口对比较类的侵入性弱,但对算法代码的侵入性强。
来篇正能量: