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);}”被当成了函数声明,而不是一个函数表达式,从 ...
随机推荐
- SQL Server 列存储索引 第四篇:实时运营数据分析
实时运营数据分析(real-time operational analytics )是指同时在同一张数据表上执行分析处理和业务处理.分析查询主要是对海量数据执行聚合查询,而事务主要是指对数据表进行少量 ...
- python机器学习卷积神经网络(CNN)
卷积神经网络(CNN) 关注公众号"轻松学编程"了解更多. 一.简介 卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人 ...
- 剑指29:最小的k个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. class Solution {public: vector& ...
- Redis快速入门教程
1.Redis介绍 Redis说白了就是个存放Key-Value数据接口的内存存储系统,主要用作数据库缓存和消息代理. 内部支持sring,hash,list,set,sorted-set五种数据结构 ...
- EFCore 5 新特性 `SaveChangesInterceptor`
EFCore 5 新特性 SaveChangesInterceptor Intro 之前 EF Core 5 还没正式发布的时候有发布过一篇关于 SaveChangesEvents 的文章,有需要看可 ...
- Java8 新特性 —— Stream 流式编程
本文部分摘自 On Java 8 流概述 集合优化了对象的存储,大多数情况下,我们将对象存储在集合是为了处理他们.使用流可以帮助我们处理对象,无需迭代集合中的元素,即可直接提取和操作元素,并添加了很多 ...
- sendfile zero-copy
传统read/write进行网络文件传输过程当中,文件数据实际上经过四次copy操作: 硬盘->内核buf->用户buf->socket相关缓冲区->协议引擎 而sendfil ...
- 【webSocket】实现原理
服务端文件: import base64 import hashlib import socket # 将请求头格式化成字典 def get_headers(data): ""&q ...
- gcc 去除无用程序段
嵌入式系统中,对程序尺寸要求高时,可以使用本方法 代码中,经常会有一种情况,库中并非所有函数都会用到.然而,无用的函数也最终被编译进可执行文件中了. 为避免这一情况,可以在编译时,添加选项:-ffun ...
- Linux上传递文件到另外一个Linux服务器
现在的项目由于安全的需要,测试服务器被设置不能直接连接,想要连接的话,只能先登录一个服务器,然后以这个服务器为跳板,去登录另外一台真正的 服务器,即使是测试环境也只能这样操作.只能是相对来说安全一些. ...