当前位置: 首页 > news >正文

Java对象的比较

对象的比较

1)==的比较

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

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方法比较的是两个对象,是否为同一引用

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}// 重写equals方法@Overridepublic 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
public class Person implements Comparable<Person> {private String name;private int age;// 构造方法和getter省略@Overridepublic 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 相同

public class Person {private String name;private int age;// 构造方法和getter省略
}class ageComparator implements Comparator<Person>{@Overridepublic 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在使用时单独写出一个类作为比较器可以通过方法重构同时实现多种排序策略

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

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

http://www.lryc.cn/news/589811.html

相关文章:

  • 【ArcGISPro】修改conda虚拟安装包路径
  • C++ 计数排序、归并排序、快速排序
  • 图机器学习(10)——监督学习中的图神经网络
  • 【AI智能体】Dify 基于知识库搭建智能客服问答应用详解
  • AdsPower 功能详解 | 应用中心使用指南:插件统一管理更高效、更安全!
  • 医疗AI“全栈原生态“系统设计路径分析
  • Win11专业工作站版安装配置要求
  • 力扣每日一题--2025.7.16
  • MAC 苹果版Adobe Photoshop 2019下载及保姆级安装教程!!
  • 第六章 OBProxy 路由与使用运维
  • 【基于PaddlePaddle训练的车牌识别系统】
  • http协议学习-1
  • vue的provide和inject
  • 基于 Docker 环境的 JupyterHub 详细部署手册
  • 论文导读--PQ3D:通过分段级分组实现多模态特征融合和 MTU3D:在线查询表示学习与动态空间记忆
  • cell2location复现
  • xss-labs练习
  • Android-EDLA【CTS】CtsTetheringTest存在fail
  • 探究Netty 4.2.x版本
  • 动态规划题解——分割等和子集【LeetCode】
  • Spring Boot 整合 Nacos 实战教程:服务注册发现与配置中心详解
  • docker的搭建
  • 导入无人机航拍屋顶,10分钟智能铺设光伏板
  • RICE-YOLO:基于改进YOLOv5的无人机稻穗检测新方法
  • 分布式缓存击穿以及本地击穿解决方案
  • 【tower】Rust tower库原理详解以及axum限流实战
  • 硅基计划2.0 学习总结 玖 图书管理系统 初版
  • 推荐《Python 编程:从入门到实践》之Python编程的基础知识
  • FastStone Capture (屏幕截图)v10.9 汉化版
  • 本地部署分布式系统服务发现与配置管理Consul,并实现无公网IP简单操作让外部访问