java对象的比较

刺骨的言语ヽ痛彻心扉 2023-09-27 14:04 191阅读 0赞

一、基本类型的比较

在Java中,基本类型的对象可以直接比较大小。
(<,>,>=,<=,==,!=)

==运算符比较:

基本数据类型,比较值是否相同

引用类型,比较引用变量的首地址是否相同

二、equals

equals 有两种判断方式,但是都是建立在引用类型上的比较
1.当我们的子类没有重写equals 时,我们调用的时Object 的equals方法,只能判断两个引用类型的地址是否相同;
2.当我们的子类重写equals 时,可以判断的是内容是否相等,这里判断的规则我们自己写。(我自己这么理解的)

  1. public class Card {
  2. public int rank; // 数值
  3. public String suit; // 花色
  4. public Card(int rank, String suit) {
  5. this.rank = rank;
  6. this.suit = suit;
  7. }
  8. //重写相当于自己定义比较规则
  9. @Override
  10. public boolean equals(Object o) {
  11. // 自己和自己比较,如果相等返回true
  12. if (this == o) {
  13. return true;
  14. }
  15. //o如果是null对象,或者o不是Card的子类
  16. if (o == null || !(o instanceof Card)) {
  17. return false;
  18. }
  19. //注意基本类型可以直接比较,但引用类型最好调用其equal方法
  20. Card c = (Card) o;
  21. return rank == c.rank
  22. && suit.equals(c.suit); //这里是直接比较数值的大小
  23. }
  24. }

**注意: 一般覆写 equals 的套路就是上面演示的

  1. 如果指向同一个对象,返回 true
  2. 如果传入的为 null,返回 false
  3. 如果传入的对象类型不是 Card,返回 false
  4. 按照类的实现目标完成比较,例如这里只要花色和数值一样,就认为是相同的牌
  5. 注意下调用其他引用类型的比较也需要 equals,例如这里的 suit 的比较覆写基类equal的方式虽然可以比较,但缺陷是:equal只能按照相等进行比较,不能按照大于、小于的方式进行比较。**

equalsgnoreCase 比较的是内容并且忽略大小写。

三、Comparble比较器

Comparable接口

Comparble是JDK提供的泛型的比较接口类,源码实现具体如下:

public interface Comparable {

public int compareTo(T o);

}

该接口只存在一个public int compareTo(T o);方法,该方法表示所在的对象和o对象进行比较,返回值分三种:
1: 表示当前对象大于o对象
0: 表示当前对象等于o对象
-1: 表示当前对象小于o对象

对用用户自定义类型,如果要想按照大小与方式进行比较时:在定义类时,实现Comparble接口即可,然后在类中重写compareTo方法

举个栗子:

需求: 在优先级队列中存储对象学生,每个学生有idnameage三个属性,并且使优先级队列每次按照学生的id从小到大取出。

代码示例:
Student类: 当前类实现了Comparable接口,即当前类提供了默认的比较方法。

  1. 实现接口,创建自定义类
  2. public class Student implements Comparable{
  3. private int id;
  4. private String name;
  5. private int age;
  6. public Student(int id, String name, int age) {
  7. this.id = id;
  8. this.name = name;
  9. this.age = age;
  10. }
  11. public int getId() {
  12. return id;
  13. }
  14. @Override
  15. public String toString() {
  16. return "Student{" +
  17. "id=" + id +
  18. ", name='" + name + '\'' +
  19. ", age=" + age +
  20. '}';
  21. }
  22. //重写compareTo方法
  23. @Override
  24. public int compareTo(Object o) {
  25. Student o1 = (Student)o;
  26. return this.id - o1.id;
  27. }
  28. }

Comparator比较器

如果使优先级队列按照学生id从大到小取出呢?我们很快就会想到修改Student类的compareTo方法,使return o1.id - this.id;,这样当然可以实现我们的新需求。但是有很多时候类的compareTo方法是不能修改的,比如JDK给我们提供的源代码,在不修改compareTo方法的前提下实现需求,只能用Comparator比较器了。

Comparator接口

public interface Comparator {

int compare(T o1, T o2);

}

该接口中提供了int compare(T o1, T o2)方法,该方法需要参数是两个待比较的对象
返回结果是int类型:
1: 表示o1对象大于o2对象
0: 表示o1对象等于o2对象
-1: 表名o1对象小于o2对象

覆写Comparator中的compare方法

  1. import java.util.Comparator;
  2. class Card {
  3. public int rank; // 数值
  4. public String suit; // 花色
  5. public Card(int rank, String suit) {
  6. this.rank = rank;
  7. this.suit = suit;
  8. }
  9. }
  10. class CardComparator implements Comparator<Card> {
  11. // 根据数值比较,不管花色
  12. // 这里我们认为 null 是最小的
  13. @Override
  14. public int compare(Card o1, Card o2) {
  15. if (o1 == o2) {
  16. return 0;
  17. } if
  18. (o1 == null) {
  19. return -1;
  20. }
  21. if (o2 == null) {
  22. return 1;
  23. }
  24. return o1.rank - o2.rank;
  25. }
  26. public static void main(String[] args){
  27. Card p = new Card(1, "♠");
  28. Card q = new Card(2, "♠");
  29. Card o = new Card(1, "♠");
  30. // 定义比较器对象
  31. CardComparator cmptor = new CardComparator();
  32. // 使用比较器对象进行比较
  33. System.out.println(cmptor.compare(p, o)); // == 0,表示牌相等
  34. System.out.println(cmptor.compare(p, q)); // < 0,表示 p 比较小
  35. System.out.println(cmptor.compare(q, p)); // > 0,表示 q 比较大
  36. }
  37. }

注意:Comparator是java.util 包中的泛型接口类,使用时必须导入对应的包。

三种方式的比较




















覆写的方法 说明
Object.equals 因为所有类都是继承自 Object 的,所以直接覆写即可,不过只能比较相等与
Comparable.compareTo 需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于
内部顺序
Comparator.compare 需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性

发表评论

表情:
评论列表 (有 0 条评论,191人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java对象比较

    本文章主要介绍了Java对象的比较,首先我们介绍了元素和对象之间分别是如何比较的,然后我们讲解了继承Comparable接口进行比较,最后讲解了什么是PriorithQu...

    相关 Java - 对象比较

    一、问题提出 > 前面讲了优先级队列,优先级队列在插入元素时有个要求:插入的元素不能是null或者元素之间必须要能够进行比较,为了简单起见,我们只是插入了Integer类

    相关 Java对象比较

    一 点睛 在Java中,有两种方式可用于对象间的比较: 利用"=="运算符:用于比较两个对象的内存地址值(引用值)是否相等。 利用equals()方法:用于比较