java 如何重写equals
java中重写equals表面上看只涉及equals与hashCode两个方法,但如果仔细考虑发现重写一个逻辑完整的equals并不容易,需要考虑克隆,继承(多态)等问题,下面是最近的几点心得
1.先使用==进行判断,==判断的是hashCode是否相等,可以姑且理解为对象的"内存地址",所以重写equals必须重写hashCode方法
2.使用getClass判断类型,如果允许子类与父类对象相等,使用instanceof进行判断
3.最后判断域,域的判断对于基本类型使用==,包装类,字符串等非基本类型使用equals判断
但最好的方式是Objects.equals
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)否则就是死循环了
java 如何重写equals的更多相关文章
- 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?
Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...
- JAVA中重写equals()方法的同时要重写hashcode()方法
object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法 ...
- [java] 为什么重写equals()必须要重写hashCode()
本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 在Java API文档中关于hashCode方法有以下几点规定(原文来自java深入解析一书) 1 在j ...
- JAVA中重写equals()方法为什么要重写hashcode()方法?
object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法 ...
- java -为什么重写equals(),还需要重写hashCode()?
1.先post这两个方法的基本定义: equals()的定义: 浅谈Java中的equals和==(转) hashCode()的定义: java中hashCode()方法的作用 Java中hashCo ...
- java 为什么重写equals一定要重写hashcode?
前言 最近复习,又看到了这个问题,在此记录和整理,通过例子来说明这种情况的原因,使大家可以清晰明白这个问题. 初步探索 首先我们要了解equals方法是什么,hashcode方法是什么. equals ...
- JAVA中重写equals()方法为什么要重写hashcode()方法说明
重写hashCode()时最重要的原因就是:无论何时,对同一个对象调用hashCode()都应该生成同样的值.如果在将一个对象用put()方法添加进HashMap时产生一个hashCode()值,而用 ...
- java中的equals()方法重写
如何java中默认的equals方法跟实际不符的话,需要重写equals方法.例如: public class TestEquals { public static void main(String[ ...
- java重写equals方法
@Override public int hashCode() { return task.getId(); } @Override public boolean equals(Object obj) ...
随机推荐
- IDEA切换git分支
查看当前所在分支 场景:在多人开发中,需要在主分支的基础上创建一些分支分配给小团队或个人去开发,然后小分支上的小功能开发完毕之后,再merge(合并)到主分支. 1.查看当前所在的分支 下图1.1中是 ...
- MyEclipse2014,java文件无法编译,run as上是none applicable,不是文件本身的问题
1.配置一下JDK目录 2.window -> Preferences -> java -> Installed JREs -> Add
- qt .pro文件和cmakelists.txt配置第三方库
.pro文件引用第三方库文件和头文件路径 1.库文件(LIBS添加的是共享库文件,-L添加目录,-l指定共享库名称) LIBS += -L/usr/local/lib -lmath LIBS的使用就是 ...
- qt开发ROS gui 遇到:global.h:1087:4: error: #error "You must build your code with position independent code if Qt was built with -reduce-relocations. "......
具体错误如下: 一共出现38个错误 这个错误是在导入cmakelists.txt时产生的,其实不是工程本身的问题,是因为我卸载ros,再重新安装ros的过程中把qtcreator的部分包给删除了,导致 ...
- Jupyter Magic - Timing(%%time %time %timeit)
对于计时有两个十分有用的魔法命令:%%time 和 %timeit. 如果你有些代码运行地十分缓慢,而你想确定是否问题出在这里,这两个命令将会非常方便. 1.%%time 将会给出cell的代码运行一 ...
- Java中Map/List/Set .
很实用,分享一下. 简单版本 复杂版本 参考: http://initbinder.com/articles/cheat-sheet-for-selecting-maplistset-in-java. ...
- js判断浏览设备是 手机端,电脑端还是平板端
console.log(navigator.userAgent); var os = function() { var ua = navigator.userAgent, isWindowsPhone ...
- 关于XIFF开发IM的一些想法
因为发现网上XIFF的资料真的不多,何况现在gg又被和谐,查询资料很是不便.我写这篇文章的目的除了跟大家分享一些开发心得,也希望有类似经验的朋友看到文章后有机会多多交流. 之前我没有怎么接触过flas ...
- [C#] 如何把void*转换为byte[]
一般来说,C#库的对外接口应该提供byte[]这样比较容易用的接口,而不应该提供裸的void* 但是有些库确实是这么封装的.那么就有一个如何转换的问题.MSDN推荐的转换方式是使用UnmanagedM ...
- hdu 1045 Fire Net(dfs)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...