纸上得来终觉浅,绝知此事要躬行
--陆游 问渠那得清如许,为有源头活水来 --朱熹
equals()的作用是用来判断两个对象是否相等,在Object类中,equals(Object obj)是通过判断两个对象的地址是否相等(是否是同一个对象)来区分它们是否相等,源码:
public boolean equals(Object obj) { return (this == obj);}
因为Object类是所有类的父类,因此在子类中使用equals(Object obj)时都是用来判断两个对象是否是同一个对象,当向判断两个对象的内容是否相等时需要重写equals()方法。还有常用的方法是“==”,等号也是对对象引用的判断。
重写equals()和没有重写equals()的示例对比:
public class Hello { public static void main(String []args) { Person1 person1=new Person1(10, "tian"); Person1 person2=new Person1(20, "tian"); if(person1.equals(person2)) { System.out.println("相等"); } else { System.out.println("不想等"); } if(person1==person2) { System.out.println("相等"); } else { System.out.println("不相等"); } Person2 person22=new Person2(10, "tian"); Person2 person23=new Person2(10, "tian"); if(person22.equals(person23)) { System.out.println("相等"); } else { System.out.println("不相等"); } if(person22==person23) { System.out.println("相等"); } else { System.out.println("不相等"); } } public static class Person1 { int age; String name; public Person1(int age,String name) { this.age=age; this.name=name; } } public static class Person2 { int age; String name; public Person2(int age,String name) { this.age=age; this.name=name; } @Override public boolean equals(Object object) { if (object==null) { return false; } if(this==object) { return true; } if(this.getClass()!=object.getClass()) { return false; } Person2 person2=(Person2)object; return person2.name.equals(name)&&person2.age==age; } }}
在Object类中,hashCode()方法是本地方法,返回的是对象的地址值,而Object类中的equals()方法比较的也是两个对象的地址值,因此equals()相等,说明两个对象地址值的相等,因此hashCode()也就相等了。
因为在常用的函数中都会对equals()和hashCode()两个函数进行重写,一般对equals()函数重写时也需要对hashCode()函数进行重写,不然会出现equals()相等而hashCode()不相等的情况。在集合类中的,HashSet,HashMap和Hashtable中存在hashCode()相等而equals()不相等的情况,因为都是对hashCode()和equals()进行重写了。
版权声明:知识在于分享,技术在于交流,转载时请留一个博主的链接就好
时间: 2024-10-24 22:27:18