Java中equals()方法的重写

简介: Java中equals()方法的重写

equals


我们知道equals()方法是定义在Object类中的,在没有被覆写时该方法与运算符==的作用是一样的。因为在 Object 类中equals()直接使用= =来实现。

值得注意的是 == 比较时用的是正真的地址。

那是不是我们要用时都需要覆写呢?其实也不是这样的,在一些标准类库中有的已经覆写好了可以直接使用,常见的有 file , integer , data , String类。


下面我们一起来学习吧!


public  boolean equals(Object obj)

指示其他某个对象是否与此对象“相等”。

equals 方法在非空对象引用上实现相等关系:


· 自反性:对于任何非空引用值

x,x.equals(x) 都应返回 true。


· 对称性:对于任何非空引用值

x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。


· 传递性:对于任何非空引用值

x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。


· 一致性:对于任何非空引用值

x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。


· 对于任何非空引用值 x,x.equals(null) 都应返回 false。


Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。


注意:当此方法被重写时,通常有必要重写

hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。


参数:


obj


要与之比较的引用对象。

返回:


如果此对象与 obj 参数相同,则返回 true;否则返回 false。


此处只是为了实现equals方法的重写,就不对hashcode方法的重写。

那怎样实现呢?

Students类


 package it.itcost;
 public class Students {
  //学生的姓名
  private String name;
  //学生的学号
  private int id;
  //学生的成绩
  private double grade;
  Students(String name,int id,double grade){//三个参数的构造函数,用于给属性初始化
   this.name = name;
   this.id = id;
   this.grade = grade;
  }
  //重写object的equals方法
  //形参用object类型,有利于在继承了同一个父类的子类对象可以使用该方法
  public boolean equals(Object obj){//显示参数名为obj
   //检测this与obj是否引用同一个对象
   if(this == obj)
    return true;
   //检测odj是否为null,如果为空则返回false
   if(obj == null)
    return false;
   //比较this与odj是否属于同一个类如果equals的语义在每一个类中有所改变,就使用getClass检测
   if(this.getClass().getName() != obj.getClass().getName())
    return false;
 //  //如果所有的子类都有统一的语义,就使用instanceof检测
 //  //instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
 //  if(!(obj instanceof Students))
 //   return false;
   //通过以上的判断我们知道了Students的对象以及传给obj的对象不为null
   //对obj向下造型
   Students other = (Students)obj;
   //测试对象的各属性的值是否相等
   return name.equals(other.name)  //name是String类型是引用类型并且覆写了equals方法,可以通过调用String类的equals来比较
     &&this.id==other.id  //id是基本类型直接使用==比较值是否相等
     &&this.grade==other.grade;  //grade是基本类型直接使用==比较值是否相等
  }
 }


下面是测试代码


 package it.itcost;
 public class StudentsTest {
  public static void main(String[] args) {
   Students Stu0 = new Students("柒间",20182206,90.00);
   Students Stu1 = new Students("柒间",20182206,90.00);
   Students Stu = new Students("Tom",20180000,80.00);
   //Stu1---Stu0
   System.out.println((Stu1.equals(Stu0)));
   //Stu---Stu0
   System.out.println((Stu.equals(Stu0)));
  }
 }


上面代码自己手写的如有改进的地方欢迎留言一起学习!


相关文章
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
77 9
|
24天前
|
存储 Java C++
java中“==”和equals,究竟比的是什么
java中“==”和equals,究竟比的是什么
50 4
|
2月前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
45 4
|
2月前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
45 4
|
2月前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
27 1
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
137 4
|
Java
JAVA方法的定义
JAVA方法的定义
100 0
|
7月前
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
48 1
|
8月前
|
存储 Java
Java数组与带参数方法:定义、调用及实践
Java数组与带参数方法:定义、调用及实践
81 1