Java对象的比较

对象的比较

1)==的比较

此运算符用于比较两个对象的引用是否相同,也就是判断它们是否指向内存中的同一个对象

java 复制代码
Person p1 = new Person("Alice", 25);
Person p2 = p1; // p2和p1引用同一个对象
Person p3 = new Person("Alice", 25); // 创建新对象

System.out.println(p1 == p2); // 输出:true
System.out.println(p1 == p3); // 输出:false,尽管内容相同

2)equals()方法的比较

equals()方法的作用是比较两个对象的内容是否一样,返回类型为boolean

但是!!
它的默认实现(继承自Object类)和 "==" 的效果是一样的,所以通常需要在类中重写这个方法

equals无法实现大于小于的比较

简单来说就是在不对equals方法重写时,equals方法比较的是两个对象,是否为同一引用

java 复制代码
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 重写equals方法
    @Override
    public boolean equals(Object obj) {
    // 特殊情况,如果两个对象引用相同内容也肯定相同
    // this 代表当前对象(调用 equals() 方法的对象)
        if (this == obj) return true;
    // 特殊情况2,如果两个类的类别都不一样,或者有null,二者内容不可能相同
        if (obj == null || getClass() != obj.getClass()) return false;
    // 将参数转换回Person类
        Person person = (Person) obj;
    // name是String类,String类已经默认写好了equals方法
        return age == person.age && name.equals(person.name);
    }
}

// 使用示例
Person p1 = new Person("Alice", 25);
Person p3 = new Person("Alice", 25);

System.out.println(p1.equals(p3)); // 输出:true(内容相同)

3)Comparable接口

Comparable被称为内部比较器

定义类的 "自然排序" 规则,使对象可直接用于排序操作

如字母按ABCD的顺序

使用步骤

  1. 类实现 Comparable 接口
  2. 重写 compareTo(T other) 方法
    返回值规则:
  3. 负数:当前对象小于 other
  4. 零:当前对象等于 other
  5. 正数:当前对象大于 other
java 复制代码
public class Person implements Comparable<Person> {
    private String name;
    private int age;

    // 构造方法和getter省略

    @Override
    public int compareTo(Person other) {
        // 按姓名升序排序
        return this.name.compareTo(other.name);
    }
}

// 使用示例
List<Person> people = Arrays.asList(
    new Person("Bob", 25),
    new Person("Alice", 30)
);
Collections.sort(people); // 按姓名排序,输出:[Alice, Bob]

4)Comparator接口

Comparator被称为外部比较器

在不修改原类的前提下,定义多种排序策略,适用于 原类未实现 Comparable,需要多种排序方式(如按年龄、按姓名长度等)

使用方式

  1. 实现 Comparator 接口(匿名类或独立类)
  2. 重写 compare(T o1, T o2) 方法

返回值规则与 compareTo 相同

java 复制代码
public class Person {
    private String name;
    private int age;

    // 构造方法和getter省略
}

class ageComparator implements Comparator<Person>{
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge(); // 按年龄升序
    }
}

// 使用示例
List<Person> people = Arrays.asList(...);
people.sort(ageComparator); // 按年龄排序
people.sort(nameComparator); // 按姓名排序

5)comparator和comparable的区别

  1. comparator中重写的方法是int compare(T o1, T o2)

    comparable中重写的方法是int compareTo(T other)

  2. 对类的侵入性(即对类源码的影响),Comparator无需修改原类代码,comparable必须修改类的源码

  3. 实现位置 Comparable实现在对象内部,由对象实现了接口后重写compareTo方法

    而Comparator实现在独立的类

  4. Comparable 只能定义一种 "自然排序"

    Comparator可以为同一个类创建多种不同的比较规则
    简单来说就是,comparator在使用时单独写出一个类作为比较器可以通过方法重构同时实现多种排序策略

java 复制代码
class ageComparator implements Comparator<Person>{
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge(); // 按年龄升序
    }
   // 策略2:按姓名从Z到A(降序)
    @Override
    public int compare(Person p1, Person p2) {
        // String的compareTo是升序
        return p1.getName().compareTo(p2.getName());
    }
}

!在这里插入图片描述(https://i-blog.csdnimg.cn/direct/0c4e335f87e44662a37f3965746697bf.png

相关推荐
文丑颜不良啊37 分钟前
LeetCode1461~1480题目解析
java·leetcode
2301_780789668 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
第九序言T8 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
学长毕设9 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
步行cgn9 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川10 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵10 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
程序喵大人10 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
秋天的怀念_David10 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas10010 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品