对于基本类型:byte、short、int、long、float、double、char、boolean;它们存储的一般都是确定的值。我们使用“==”就可以直接进行比较。
int a = 10;
int b = 20;
System.out.println(a > b);
System.out.println(a < b);
System.out.println(a == b);
char c1 = 'A';
char c2 = 'B';
System.out.println(c1 > c2);
System.out.println(c1 < c2);
System.out.println(c1 == c2);
boolean b1 = true;
boolean b2 = false;
System.out.println(b1 == b2);
System.out.println(b1 != b2);
对象都是一些引用类型,通常都是我们自定义的一些类。我们就有不同的方法来进行比较。
class Student{
public String name;
public int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
Student s1 = new Student("张三",20);
Student s2 = new Student("李四",21);
Student s3 = s1;
System.out.println(s1>s2); //编译报错 引用类型不能用< >进行比较
System.out.println(s1==s2); //false
System.out.println(s1==s3); //true
}
}
为什么使用“==”看起来还可以进行比较呢?
因为现在“==”比较的不是值,而是地址!
我们自己实现的类都会默认的继承Object类,在Object类中提供了equals()方法进行对象的比较。equals()方法需要我们根据实际需求自己设计比较的规则。但是,现在我们并没有手动使用equals()进行比较,而是使用了“==”,它自己就会调用Object类默认的equals()方法进行比较。默认情况下不是比较对象的内容,而是比较对象的地址是否相同。
我们根据自己的需求重写equals()方法,比如:如果学生年龄相同且姓名相同,比较结果就相同。
class Student{
public String name;
public 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;
}
//判断类型,若比较的类型不同 比较结果:不同
if (o == null || getClass() != o.getClass()) {
return false;
}
//类型相同,根据自己的逻辑进行判断
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
}
一个问题:使用equals()方法进行比较,返回值是一个boolean值。只能判断是否相同,不能判断大小关系。
实现Comparable接口,重写compareTo()方法。既可以进行正确的比较,又可以比较出大小关系。比如:根据学生年龄,判断相同、大小关系。
class Student implements Comparable<Student>{
public String name;
public int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student o) {
return this.age - o.age;
}
}
注:
- 只能进行相同对象的比较。
- 适用于一个类的比较规则比较一定,只通过一个属性来进行比较。
- 比较规则放在每个类里面,比较固定,修改麻烦。
用户自定义比较器,实现Comparator接口。既可以进行正确的比较,又可以比较出大小关系。比如:根据学生年龄,判断相同、大小关系。
class Student {
public String name;
public int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
}
class MyComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
return o1.age - o2.age;
}
}
public class Test {
public static void main(String[] args) {
Student s1 = new Student("张三",20);
Student s2 = new Student("李四",21);
Student s3 = s1;
MyComparator myComparator = new MyComparator();
System.out.println(myComparator.compare(s1,s2));
System.out.println(myComparator.compare(s1,s3));
}
}
注:
- 只能进行相同对象的比较。
- 适用于一个类的比较规则比较多,需要使用多个属性来进行比较。可以根据每个属性都写一个比较器制定比较规则。
- 比较规则放在每个类外面,比较灵活,修改方便。