一、equals()方法介绍
Java中的equals()方法是Object类中的方法,其作用是用来比较两个对象是否相等。在默认情况下,equals()方法是通过比较两个对象的内存地址是否相等来判断两个对象是否相等的,即使两个对象的属性值完全相同,但如果它们的内存地址不同,equals()方法也会返回false。
为了实现按照对象属性值比较对象是否相等的功能,我们可以自己在类中重写equals()方法并自定义对象的比较规则。
二、equals()方法重写规则
在重写自定义类的equals()方法时,需要遵循以下几个规则:
1、自反性:对于任何非null的引用值x,x.equals(x)必须返回true。
2、对称性:对于任何非null的引用值x和y,如果x.equals(y)返回true,则y.equals(x)也必须返回true。
3、传递性:对于任何非null的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,则x.equals(z)也必须返回true。
4、一致性:对于任何非null的引用值x和y,多次调用x.equals(y)应该返回相同的结果,也就是说,在对象的比较过程中,不受外界因素影响。
5、非空性:对于任何非null的引用值x,x.equals(null)必须返回false。
三、equals()方法示例代码
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) { if (obj == null) { return false; } if (this == obj) { return true; } if (obj instanceof Person) { Person p = (Person) obj; if (this.name.equals(p.name) && this.age == p.age) { return true; } } return false; } } public class TestEquals { public static void main(String[] args) { Person p1 = new Person("Tom", 20); Person p2 = new Person("Tom", 20); Person p3 = new Person("Jack", 22); //比较p1和p2是否相等 if (p1.equals(p2)) { System.out.println("p1和p2相等"); } else { System.out.println("p1和p2不相等"); } //比较p1和p3是否相等 if (p1.equals(p3)) { System.out.println("p1和p3相等"); } else { System.out.println("p1和p3不相等"); } } }
四、equals()方法注意事项
1、重写equals()方法时,一定要同时重写hashCode()方法,否则可能会导致HashMap等集合类无法正常工作。
2、重写equals()方法时,一定要注意空值判断,否则可能会出现空指针异常。
3、重写equals()方法时,使用instanceof关键字来判断传入的对象是否为本类对象,这样可以避免强制类型转换时的ClassCastException异常。
4、如果需要比较多个属性值,建议使用Objects类的equals()方法或使用自定义的比较工具类比较。
五、总结
Java中的equals()方法在对象比较中是非常常见的,虽然默认比较方式只能比较内存地址,但是通过重写equals()方法可以实现自定义对象比较规则,从而使程序更加灵活和方便。