前言:
大家好,我是良辰丫,💞💞💞今天的我们要学习的知识点是java对象的比较
,不是大家现实生活中对象的比较,是java中new一个对象的那个对象,对象的比较到底是什么意思呢?我们往下看。⛽⛽⛽
🧑个人主页:良辰针不戳
📖所属专栏:java数据结构
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。
目录
- 1、基本类型的比较
- 1.1 简述基本类型进行比较
- 1.2 为什么对象不能直接比较
- 2、对象的比较
- 2.1 equals直接比较对象
- 2.2 重写equals方法比较对象
- 2.3 Comparable接口比较对象
- 2.4 Comparator比较器
- 3. 三种比较方式对比
- 3.1 Object.equals
- 3.2 Comparable.compareTo
- 3.3 Comparator.compare
1、基本类型的比较
1.1 简述基本类型进行比较
在java中基本类型可以直接比较大小。
public static void main(String[] args) {
int a = 520;
int b = 250;
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);
}
1.2 为什么对象不能直接比较
有人可能会说,那对象也可以进行比较呀,我们看一个简单的例子。
class Stu{
private String name;
private int age;
public Stu(String name,int age){
this.name = name;
this.age = age;
}
}
public class Test10 {
public static void main(String[] args) {
Stu stu1 = new Stu("张三",18);
Stu stu2 = new Stu("张三",18);
System.out.println(stu1 == stu2);
}
}
我们new了两个对象,但是我们在在这两个对象中想表示的是同一个人,然而呢,进行表示的时候却打印出了false,why?why?why?谁能告诉我怎么回事呢?原来呀,直接比较镀锡,比较的是对象的地址,new了两块空间,当然会打印false。那么我们如何真正的对对象进行比较呢?先喝一口茶压压惊☕☕☕,然后慢慢往下看。
2、对象的比较
2.1 equals直接比较对象
java中的equals方法只能比较对象是否相同,如果你不给它制定规则,它默认调用的是Objects的方法。
public static void main(String[] args) {
Stu stu1 = new Stu("张三",18);
Stu stu2 = new Stu("张三",18);
System.out.println(stu1.equals(stu2));
}
上面直接调用equals方法,还是打印的false,那么我们需要给它制定比较规则,如何做呢?我们慢慢往下看。
2.2 重写equals方法比较对象
class Stu{
private String name;
private int age;
public Stu(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;
Stu stu = (Stu) o;
return age == stu.age && Objects.equals(name, stu.name);
}
}
public class Test10 {
public static void main(String[] args) {
Stu stu1 = new Stu("张三",18);
Stu stu2 = new Stu("张三",18);
System.out.println(stu1 == stu2);
}
}
此时,奇迹发生了,打印出来的是true,因为我们给它制定了一个比较规则,重写了equals方法,只要比较对象里的姓名和年龄都相同的时候就返回true,否则,返回false。
2.3 Comparable接口比较对象
对用用户自定义类型,如果要想按照大小与方式进行比较时:在定义类时,实现Comparble接口即可,然后在类中重写compareTo方法。
class Stu implements Comparable<Stu>{
private String name;
private int age;
public Stu(String name,int age){
this.name = name;
this.age = age;
}
@Override
public int compareTo(Stu o) {
return this.age - o.age;
}
}
public class Test10 {
public static void main(String[] args) {
Stu stu1 = new Stu("张三",18);
Stu stu2 = new Stu("张三",18);
System.out.println(stu1.compareTo(stu2));
}
}
那么问题又来了,如果一个对象有很多属性,我想根据某个属性进行比较,比如年龄或者性别,难道一个个修改比较规则嘛,这样我们又引入了一种比较容器,Comparator比较器。
2.4 Comparator比较器
- 用户自定义比较器类,实现Comparator接口
- 重写Comparator中的compare方法
import java.util.Comparator;
class Stu implements Comparable<Stu>{
public String name;
public int age;
public Stu(String name,int age){
this.name = name;
this.age = age;
}
@Override
public int compareTo(Stu o) {
return this.age - o.age;
}
}
class AgeComparator implements Comparator<Stu> {
@Override
public int compare(Stu o1, Stu o2) {
return o2.age - o1.age;
}
}
class NameComparator implements Comparator<Stu> {
@Override
public int compare(Stu o1, Stu o2) {
return o2.name - o1.name;
}
}
public class Test10 {
public static void main(String[] args) {
Stu stu1 = new Stu("张三",18);
Stu stu2 = new Stu("张三",18);
AgeComparator ageComparator = new AgeComparator();
System.out.println(ageComparator.compare(stu1,stu2));
}
}
看了上面两种比较方式,是不是感觉很乱,第一次接触就是这样,多去感悟,多去理解,慢慢就熟悉了,为了让大家更熟悉,简单去总结一下。
3. 三种比较方式对比
3.1 Object.equals
因为所有类都是继承自 Object 的,所以直接覆写即可,不过只能比较相等。
- equals的返回值为布尔类型,重写后也是只能去根据某个属性判断是否相等。
- 重写后太死板,只能比较是否相等。
3.2 Comparable.compareTo
需要手动去实现接口,实现接口后,每次用该类,都有顺序,属于内部顺序。
- 类需要实现Comparable接口。
- 实现接口后,返回值为int,可以比较大小。
- 不灵活,指定根据某个属性比较,那么要想根据别的属性进行比较,还得重新修改比较的属性。
3.3 Comparator.compare
需要实现一个类比较器,对待比较类的侵入性弱,但对算法代码实现侵入性
强。
- 需要创建一个类实现该比较器。
- 可以灵活比较各个属性(定义各个类去实现该比较器)。
- 代码比较多。
后序:
看到这里,大家对Comparable接口比较和Comparator类比较器有了一定的认识,大家多去学习,去品味,后面好多知识点需要通过这两种比较方式。希望我的文章能给大家带来帮助,我们一起加油!!!🍎🍎🍎