java 如何重写equals

java中重写equals表面上看只涉及equals与hashCode两个方法,但若是仔细考虑发现重写一个逻辑完整的equals并不容易,须要考虑克隆,继承(多态)等问题,下面是最近的几点心得java

1.先使用==进行判断,==判断的是hashCode是否相等,能够姑且理解为对象的"内存地址",因此重写equals必须重写hashCode方法缓存

2.使用getClass判断类型,若是容许子类与父类对象相等,使用instanceof进行判断3d

3.最后判断域,域的判断对于基本类型使用==,包装类,字符串等非基本类型使用equals判断对象

但最好的方式是Objects.equalsblog

4.重写hashCode,调用Objects.hashCode便可继承

 

看下Objects.equals的源码内存

先使用==进行判断,而后判空,调用equals,这让我想起了两个包装类型比较的问题,拿Integer来讲,一般我会先判空,而后调用intValue用==进行判断,或者先判空,而后调用equals.虽然有-128~127的缓存机制,但直接使用==判断包装类型每每是有问题的,而使用前面的两种都要先判空,否则NPE,而直接调用Objects.equals就没有这个问题了字符串

此外从上面看到Objects.equals调用了对象的equals,假设定义了类A,B,对象为a,b,若是A重写了equals,千万不能在equals中直接调用Object.equals(a,b)不然就是死循环了get

相关文章
相关标签/搜索