🍉作者@ Autumn60
🏄欢迎关注:👍点赞🙌收藏✍️留言
👲微语 :不行动,梦想就只是好高骛远; 不执行,目标就只是海市蜃楼。想做一件事,就请马上开始。
目录
在Java中一共有两种比较方式: 基本类型和引用类型之间的比较,也就是只有三种方法:
一、基类比较
在Java中,基本类型 (int, long ....类型 ) 的对象可以直接比较大小。
也就是用 == > < 来进行比较
代码:
public class TestCompare {
public static void main(String[] args) {
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);
}
}
输出:
二、引用类型比较
如果是对象之间的比较呢 :
因为在Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较。 那为什么==可以比较? 因为:对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equal方法,而==默认情况下调 用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址,也就是说此处的 == 是比较 student1 和 student2 的地址两个地址不一样,肯定输出false
代码:
class Student{
private String name;
private int age;
public void Student(String name,int age) {
this.age = age;
this.name = name;
}
}
public class Code6_1 {
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student();
student1.Student("张三",18);
student2.Student("李四",20);
System.out.println(student1 == student2);
/*System.out.println(student1 > student2);
System.out.println(student1 < student2);*/
}
}
运行结果:
2.1 Comparator 接口
实现这个接口的类我们称为比较器类
实现这个接口,要重写compare方法,
compare返回值的三种情况与compareTo相同
比较器类:
而如果想要比较这两个学生的大小可以自己实现一个Comparator 或者 Comparable 接口来进行比较;
自动生成:光标放在异常处:按ALT + ENTER 回车自动生成
重写后的比较:
Comparable:是 this 和 o 的比较,当 this > o时,返回一个任意一个正数,当 this < o时,返回任意一个负数,当 this = o 时,返回0
import java.util.Comparator;
class Student implements Comparator<Student> {
private String name;
private int age;
public void Student(String name,int age) {
this.age = age;
this.name = name;
}
@Override
public int compare(Student o1, Student o2) {
return o1.age - o2.age;
//这里是根据 学生1 的年龄 和学生2 的年龄来进行比较,如果是负数,说明学生1年龄小,反之则大于,等于说明年龄一样;
}
}
public class Code6_1 {
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student();
student1.Student("张三",18);
student2.Student("李四",20);
System.out.println(student1.compare(student1, student2));
}
}
2.2 Comparable 接口
Java中的Comparable接口是一个泛型接口,用于定义类的自然排序顺序。该接口包含一个compareTo方法,用于比较两个对象的大小关系。
compareTo方法的返回值有三种情况
== 0 说明this指向的对象 等于 o指向的对象
< 0 说明this指向的对象 小于 o指向的对象
>0 说明this指向的对象 大于 o指向的对象
代码:
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int compareTo(Person other) {
if (this.age < other.age) {
return -1;
} else if (this.age > other.age) {
return 1;
} else {
return 0;
}
}
// getters and setters
}
在上述代码中,Person类实现了Comparable接口,并覆盖了compareTo方法来实现按照年龄升序排列的自然排序。在这个例子中,如果两个Person对象的年龄相等,它们将被认为是相等的,因此compareTo方法返回0。
【缺陷】这种比较方法有一个明显的缺陷,那就是只能比较一种数据
2.3 equals()
默认情况下,equals() 方法比较两个对象的引用是否相等,即它们是否指向同一个内存地址。
重写equals() 方法 ,则比较的是对象的内容是否相等, 也就是例子中的学生1 的姓名 和 年龄 和 学生2 的姓名和年龄是否相等;
代码:
重新equals
import java.util.Comparator;
import java.util.Objects;
class Student implements Comparator<Student> {
private String name;
private int age;
public void Student(String name,int age) {
this.age = age;
this.name = name;
}
@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);
}
@Override
public int compare(Student o1, Student o2) {
return o1.age - o2.age;
//这里是根据 学生1 的年龄 和学生2 的年龄来进行比较,如果是负数,说明学生1年龄小,反之则大于,等于说明年龄一样;
}
}
public class Code6_1 {
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student();
student1.Student("张三",18);
student2.Student("张三",18);
//比较对象地址是否相等;
System.out.println(student1 == student2);
//比较对象内容是否相等
System.out.println(student1.equals(student2));
}
}
运行结果为
false
true
== 比较的是地址
以下是一些常见的比较方法:
比较对象的属性值:将对象的各个属性进行比较,如果属性值都相等,则认为两个对象相等。
比较对象的类型:如果两个对象类型不同,则认为两个对象不相等。
比较对象的引用值:如果两个对象的引用值相等,则认为两个对象相等。
比较对象的哈希值:如果两个对象的哈希值相等,则认为两个对象相等。
需要注意的是,在重写equals()方法时,还需要同时重写hashCode()方法,以保证对象的哈希值正确。