Object类的equals方法
Object类是所有Java类的根类,它提供了一些通用的方法,其中包括equals()方法。equals()方法用于比较两个对象是否相等,它的默认实现是比较两个对象的内存地址是否相等,即它们是否引用同一个对象。如果没有在子类中重写equals()方法,则默认的实现与==操作符是等价的。
如果需要比较两个对象的属性值是否相等,就需要在子类中重写equals()方法,并在方法中比较对象的属性值。在重写equals()方法时,需要满足以下条件:
自反性:对于任何非null的引用值x,x.equals(x)应该返回true。
对称性:对于任何非null的引用值x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
传递性:对于任何非null的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也应该返回true。
一致性:对于任何非null的引用值x和y,如果在equals()比较中使用的信息没有被修改,那么多次调用x.equals(y)应该始终返回true或始终返回false。
非空性:对于任何非null的引用值x,x.equals(null)应该返回false。
例如,假设有如下的Person类:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age;} // 省略getter和setter方法 // 这里没有重写equals()方法}
如果我们创建两个Person对象,并用==操作符比较它们,返回的结果将是false,因为它们引用的是不同的对象:
Person person1 = new Person("Tom", 20);Person person2 = new Person("Tom", 20);System.out.println(person1 == person2); // 输出:false
如果我们想要比较Person对象的属性值是否相等,可以在Person类中重写equals()方法:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age;} // 省略getter和setter方法 @Override public boolean equals(Object obj) { if (obj == this) { return true;} if (!(obj instanceof Person)) { return false;} Person other = (Person) obj; return Objects.equals(name, other.name) && age == other.age;}}
这个重写的equals()方法首先判断参数是否为该对象本身,如果是,则直接返回true;如果不是,再判断参数是否属于Person类,如果是,则将参数转换为Person类型,并比较两个对象的name和age属性是否相等。如果两个属性都相等,则返回true,否则返回false。
这样,当我们使用equals()方法比较两个Person对象时,返回的结果将是true,因为它们的属性值相等:
Person person1 = new Person("Tom", 20);Person person2 = new Person("Tom", 20);System.out.println(person1.equals(person2)); // 输出:true
因此,重写equals()方法可以方便我们比较两个对象的属性值是否相等。
网友评论