当前位置: 首页 > 后端技术 > Java

Java中equals和hashCode方法

时间:2023-04-02 00:34:55 Java

equals方法Object类的equals方法就是比较两个对象的地址是否相等,也就是说所有类默认的equals方法都是比较地址是否相等平等的;所以当需要判断一个复杂对象是否相等时,我们需要重写equals方法:publicbooleanequals(Objecto){if(o==this)返回真;if(!(oinstanceofPhoneNumber))返回false;电话号码pn=(电话号码)o;返回pn.lineNum==lineNum&&pn.prefix==prefix&&pn.areaCode==areaCode;注意:equals参数类型Object不要改成其他类型,否则OverloadObject.equals而不是OverrideObject.equals;equals方法应该是自反的、对称的、传递的、一致的(如果不修改必须保持相等)和非空属性(任何对象都不能等于null,instanceof关键字可以检查)。hashCode方法哈希码有一个普遍的约定:一个对象多次调用hashCode方法应该返回相同的值;如果两个对象通过equals方法比较返回true,那么它们的hashCode一定是相等的,也就是说,相等的对象必须有相等的两个对象的哈希码(hashcode);两个对象的hashCode相等,则两个对象不一定相等;一个好的散列函数(hashCode)通常倾向于为不相等的对象产生不相等的散列码,因此可以提高散列表的性能;判断两个对象是否相等时,会先判断hashCode是否相等,如果hashCode不相等,则两个对象不相等;如果hashCode相等,则比较equals方法;它比equals方法更有效。当我们要判断Set集合中是否存在某个对象时,首先在hashCode对应的hash桶中进行定位。如果没有对象,则表示该对象不存在。如果有对象,用equals方法判断。搜索效率大大提高;(HashSet底层是通过HashMap实现的)为什么重写equals方法的时候一定要重写hashCode方法呢?Object类的equals方法比较两个对象的地址是否相等。hashCode方法是一个本地方法,返回一个对象地址转换的值,所以如果我们重写equals方法而不重写hashCode方法,那么当两个对象用equals比较的结果是相等的,但是因为他们的hashCode是不同的是,Java判断它们是两个不相等的对象,可以将它们同时放入HashSet中,从而导致错误;hashCode如何重写?声明一个int类型变量result,初始化为对象中第一个关键字段的哈希码(关键字段是指影响equals比较的字段),按照步骤2.a中的计算方法;对于每个剩余的关键字段f完成以下步骤:计算字段int类型c的哈希码:该字段为基本类型,哈希码为Type.hashCode(f),Type为对应的装箱类型;该字段为对象引用,若为null则返回0,否则调用该对象的hashCode方法;该字段是一个数组类型,对数组的每个重要元素计算一个哈希码,然后使用2.b中的方法将它们组合起来。如果数组中的所有元素都很重要,可以使用Arrays.hashCode()方法。b.将2.a中得到的哈希码按照公式合并到result中:result=31*result+c;示例:@OverridepublicinthashCode(){intresult=Short.hashCode(areaCode);结果=31*结果+Short.hashCode(prefix);结果=31*结果+Short.hashCode(lineNum);returnresult;}参考:hashCode原理分析hashCode源码《EffectiveJava第三版》面试官:为什么一定要重写equals重写hashCode方法?Javaequals方法详解