引言-为什么用Compareable和Comparator
- 对象是什么?
对象是现实世界中事务的抽象或者建模
现实事务可能被抽象为多个对象,多个对象可以代表同一个现实事务,但是一个对象不能代表多个现实事务
这里说对象和事务就是站在不同世界的角度去说,把对象迁移到现实世界就用事务来表示,
- 了解更多查看类和对象:
- equals()
public class TestEquals {
public static void main(String[] args) {
Teacher t1=new Teacher("张三");
Teacher t2=new Teacher("李四");
System.out.println(t1.equals(t2));
System.out.println(t1 == t2);
}
}
class Teacher{
String name;
public Teacher(String name){
this.name=name;
}
}
- 为什么结果都是false?
因为java语言本身无法得知,两个对象是够代表同一个现实的事务,它只知道按照是否是同一个对象处理,无法和我们现实世界联系,所以这个工作需要我们开发者来引导,那就是重写equals方法,通过设计的类目的根据某些属性作为依据来判断是否相等来决定是否代表同一个现实事务,是否同一个对象
- 解决方法
- 重写equals方法,通过设计的类目的根据某些属性来判断是否相等来决定是否代表同一个现实事务,是否同一个对象
public class TestEquals {
public static void main(String[] args) {
Teacher t1=new Teacher("张三");
Teacher t2=new Teacher("李四");
Teacher t3=new Teacher("王五");
Teacher t4=new Teacher("王五");
System.out.println(t1.equals(t2));
System.out.println(t1 == t2);
System.out.println(t3.equals(t4));
}
}
class Teacher{
String name;
public Teacher(String name){
this.name=name;
}
//重写equals方法
@Override
public boolean equals(Object obj) {
if(obj==null){
return false;
}
//不是同一类型肯定不是同一个对象
if (!(obj instanceof Teacher)){
return false;
}
// 3. 根据我们的设计类的目的,来判断对象是否代表同一个现实事物
// 主要名字一样,就代表是同一个现实事物
Teacher o=(Teacher)obj;
return this.name.equals(o.name);
}
}
- 使用比较器Compareable和Comparator也有这个功能可以依据某些属性来比较是否同一对象例如依据年龄,身高,体重等(这就是在我们相比较对象大小又没有重写equals方法,这两个比较器的出现价值就随即而来也是原因)
知道了为什么接下来就说说Compareable和Comparator的用法
Compareable接口
public class TestCompareable {
public static void main(String[] args) {
Teacher t1=new Teacher("张三",10,170,100);
Teacher t2=new Teacher("李四",20,160,120);
int r=t1.compareTo(t2);
if (r < 0) {
// 代表的意思就是 t1 指向的对象代表的现实事物 小于 t2 指向的对象代表的现实事物
System.out.println("张三 小于 李四");
} else if (r == 0) {
// 代表的意思就是 t1 指向的对象代表的现实事物 等于 t2 指向的对象代表的现实事物
System.out.println("高博 等于 陈沛鑫");
} else {
// 代表的意思就是 t1 指向的对象代表的现实事物 大于 t2 指向的对象代表的现实事物
System.out.println("高博 大于 陈沛鑫");
}
}
}
//因为是实现Compareable所以必须实现它内部的方法
class Teacher implements Comparable<Teacher>{
String name;
int age;
int height;
int weight;
public Teacher(String name, int age, int height, int weight) {
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
@Override
public int compareTo(Teacher o) {
if (this.age<o.age){
return -1;
}else if (this.age==age){
return 0;
}else{
return 1;
}
}
}
Comparator
import java.util.Comparator;
public class TestComparator {
public static void main(String[] args) {
Teacher t1=new Teacher("张三",10,170,100);
Teacher t2=new Teacher("李四",20,160,120);
Comparator<Teacher> byHeight = new ByHeightComparator();
Comparator<Teacher> byWeight = new ByWeightComparator();
int r1=byHeight.compare(t1,t2);
if (r1>0){
System.out.println("张三 高于 李四");
}else if(r1<0){
System.out.println("张三 低于 李四");
}else{
System.out.println("张三 等于 李四");
}
int r2=byWeight.compare(t1,t2);
if (r1>0){
System.out.println("张三 重于 李四");
}else if(r1<0){
System.out.println("张三 轻于 李四");
}else{
System.out.println("张三 等于 李四");
}
}
}
//通过体重比较
class ByHeightComparator implements Comparator<Teacher> {
@Override
public int compare(Teacher o1, Teacher o2) {
return o1.height - o2.height;
}
}
//通过身高比较
class ByWeightComparator implements Comparator<Teacher> {
@Override
public int compare(Teacher o1, Teacher o2) {
return o1.weight - o2.weight;
}
}
class Teacher{
String name;
int age;
int height;
int weight;
public Teacher(String name, int age, int height, int weight) {
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
}