equals的推荐写法
我们在重写equals的时候必须满足几个原则,否则,类在容器和其他场景下会出现奇怪的行为:
1.A.equals(A)=true,
2.对称性。即A.equals(B)=true;则B.equals(A)=true;这一点的反例为:我们想要与其他类实现互操作时。比如类A重写equals并且满足A.content.equal(s),其中content和s为字符串类型 ,那么类A就与String相同,但是反过来就不成立,并且当我们List<A> list;判断list.contains(s)时会发生奇怪的现象。
3.传递性。为了保证传递性我们不得不面对这个一个事实:我们无法保证扩展类的值组建的同时,又保留equals约定。比如超类重写了equals方法,子类在扩展的时候新加了值组件,这个时候超类等于子类,子类因为重写equals包含新值组件无法等于超类,为了满足对称性。在遇到超类时选择退化又会使的子类的2个对象都等于超类,但2个对象又因为新值组件的不同不能相等违反了传递性,jdk里Timestramp值组件扩展了Date,是既不推荐的做法,且Timestramp与Date不能混合使用。注意:当超类不可实例化的时候则没有上面的问题。
4.一致性,任何时候相等,任何时候不相等。反例:java.net.URL一个大错误
5.非空性:可以通过类型判断 省略if(o==null)的不必要判断
高质量equals的诀窍:
1.使用==操作符检查“参数是否为这个对象的引用”:性能优化且如果比较操作可能很昂贵,就值得这么做。
2.使用instanceof操作符检查"参数是否为正确的类型":正确类型指equals方法所在的那个类,某些情况下是指该类所实现的某个接口。
3.把参数转化为正确的类型
4.对于该类中的每个“关键”域,检查参数中的域是否与该对象中的对应的域相匹配。float和double基本类型用Float.compare(float,float)比较
工具:
google的auto value和ide自动生成
equals的推荐写法的更多相关文章
- web工程中URL地址的推荐写法
		三.web工程中URL地址的推荐写法 使用c标签<c:url value="" /> 会自动添加项目名 -> value中的值 前面要加 “/” 在JavaWeb ... 
- "aa".equals(name)这种写法为什么就可以避免空指针
		public static void main(String[] args) { String name=null; if("aa".equals(name))//这种情形,不出现 ... 
- 最简单的设计模式——单例模式的演进和推荐写法(Java 版)
		前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ... 
- Android Adapter推荐写法
		package jason.fragmentdemo.adapter; import nqy.fragmentdemo.R; import nqy.fragmentdemo.model.Article ... 
- JavaSE 学习笔记02丨对象与类
		Chapter 4. 对象与类 4.1 面向对象程序设计概述 面向对象程序设计(简称OOP),是当今主流程序设计范型.面向对象的程序是由对象组成的,每个对象(来自于标准库或自定义的)包含对用户公开的特 ... 
- java 写法推荐
		1. for循环 for (int i = 0; i < list.size(); i++) { int item = list.get(i); System.out.println(" ... 
- 重写equals时,遵守的规定
		0 正确的equals方法 public class MyClass { // 主要属性1 private int primaryAttr1; // 主要属性2 private int prima ... 
- java提高篇(十三)-----equals()方法总结
		equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ... 
- js自执行函数的几种不同写法的比较
		经常需要一个函数自执行,可惜这一种写法是错的: function(){alert(1);}(); 原因是前半段“function(){alert(1);}”被当成了函数声明,而不是一个函数表达式,从 ... 
随机推荐
- 20200722_Oracle添加表空间、用户,用户授权
			--创建表空间 CREATE TABLESPACE aifu --表空间名 aifu LOGGING DATAFILE 'D:\dev_config\OracleTableSpaces\aifu.DB ... 
- error: invalid command ‘bdist_wheel‘
			解决方法: pip3 install wheel 了解更多,请关注公众号 
- Servlet程序访问jsp文件404的一种情况
			启动Jsp Run on Server的时候出现404的错误,如下图: 检查一下是否文档目录如下图:jsp应该在WebContent下,而不是WEB_INF下,访问放在WEB_INF下的jsp文件就会 ... 
- Git--gitLab远程仓库分支代码回退的两种方案
			事由:作为仓库的master,一时老眼昏花,把同事说的不合并看成了合并,直接合并了. 解决方法: 一.粗鲁的代码回退--直接在远程仓库合并 1. 在gitLab远程仓库中,基于想回退的代码的节点(co ... 
- 蒲公英 · JELLY技术周刊 Vol.29: 前端智能化在阿里的那些事
			蒲公英 · JELLY技术周刊 Vol.29 前端智能化是指借助于 AI 和机器学习的能力拓展前端,使其拥有一些超出现阶段前端能力的特性,这将是未来前端方向中一场重要的变革.目前各家互联网厂商都有自己 ... 
- cmd的基本命令
			使用方法Windows键+R键输入cmd回车 Windows 系统常用小工具 工具名称 cmd 命令 含义 计算器 calc 与 "工具名称" 相同 记事本 notepad 与 & ... 
- Assert类的静态方法
			五:常用断言 在NUnit中,断言是单元测试的核心.NUnit提供了一组丰富的断言,这些断言是Assert类的静态方法.如果一个断言失败,方法的调用不会返回值,并且会报告一个错误.如果一个测试包含多个 ... 
- 深入浅出 webpack 之基础配置篇
			前言 前端工程化经历过很多优秀的工具,例如 Grunt.Gulp.webpack.rollup 等等,每种工具都有自己适用的场景,而现今应用最为广泛的当属 webpack 打包了,因此学习好 webp ... 
- python菜鸟教程学习1:背景性学习
			https://www.runoob.com/python3/python3-intro.html 优点 简单 -- Python 是一种代表简单主义思想的语言.阅读一个良好的 Python 程序就感 ... 
- UNION 和 UNION ALL的区别,一个例子就看明白
			[UNION ALL] select a,b,sum(sm) AS s1, SUM(qm) AS s2 from ( select 'a' AS a, 'b' AS b, 2 AS sm, 200 A ... 
