《Effective Java》知识点(2)--对于所有对象都通用的方法

10. 覆盖equals时请遵守通用约定

10.1  不要轻易覆盖equals方法,除非迫不得已。因为:

10.1.1 类的每个实例本质上都是唯一的。

10.1.2 类没有必要提供”逻辑相等“的测试功能。

10.1.3 超类已经覆盖了equals,超类的行为对于这个类也是合适的。

10.1.4 类是私有的,或者是包级私有的,可以确定它的equals方法永远不会被调用。

10.2  如果要覆盖equals方法,必须遵守5个通用约定

10.2.1 自反性(reflexive):x!=null && x.equals(x)==true

10.2.2 对称性(symmetric):x!=null && y!=null &&  x.equals(y)==true &&  y.equals(x)==true

10.2.3 传递性(transitive):x!=null && y!=null && z!=null &&  x.equals(y)==true &&  y.equals(z)==true, then  x.equals(z)==true

10.2.4 一致性(consistent):x!=null && y!=null,多次调用x.equals(y)的返回值固定不变

10.2.5 (非空性):x!=null && x.equals(null)==false

    一旦违反了约定,当其它对象面对你的对象时,完全不知道这些对象的行为会怎么样!

10.3  实现equals方法的几个诀窍

10.3.1 使用==操作符检查”参数是否为这个对象的引用“

10.3.2 使用instanceof 操作符检查”参数是否为正确的类型“

10.3.3 把参数转换成正确的类型

10.3.4 对于该类中的每个”关键“域,检查参数中的域是否与该对象中的域相匹配

10.3.5 完成equals方法后,编写单元测试来检验5个约定,特别是对称性、传递性和一致性

10.3.6 覆盖equals方法时总要覆盖hashCode

10.3.7 不要企图让equals方法过于智能

10.3.8  不要将equals声明中的Object对象替换为其它的类型(实际上并未覆盖Object.equals)

11.  覆盖equals时总要覆盖hashCode

       若不覆盖hashCode,这个类无法和HashMap\HashSet一起正常工作。

       相等的对象必须具有相等的hash code。

       习惯上使用素数来计算散列结果,31可以用移位和减法来代替乘法。

       不要试图从散列码计算中排除掉一个对象的关键域来提高性能。

       不要对hashCode方法的返回值做出具体的规定。

12.  始终要覆盖toString

       提供好的toString实现可以使类用起来更加舒适,系统也更易于调试。       

        toString方法应该返回对象中包含的所有值得关注的信息,给返回格式添加注释。

        应该为toString返回值中包含的所有信息提供可以通过编程访问的方法。 

13.  谨慎地覆盖clone

       不可变的类永远都不应该提供clone方法。

       clone方法就是另一个构造器,必须确保它不会伤害到原始的对象,并确保正确地被克隆对象中的约束条件。

       对象拷贝的最好方法是提供一个拷贝构造器或拷贝工厂。但如果是数组,最好利用clone方法拷贝数组。

14.  考虑实现Comparable接口

        实现一个对排序敏感的类时,应该实现Comparable接口,这样可以与许多泛型算法协作。

        在compareTo方法中比较域值时,应避免使用<和>操作符(繁琐且容易出错),而应该在装箱基本类型的类中使用静态的compare方法,或者在Comparator接口中使用比较器构造方法。

        通用约定:

14.1 对称性:sgn(x.compareTo(y) == -sgn(y.compareTo(x), 或都抛出异常

14.2 传递性:x.compareTo(y)>0 && y.compareTo(z)>0,then x.compareTo(z)>0

14.3 x.compareTo(y)==0, then sgn(x.compareTo(z) == sgn(y.compareTo(z)

14.4 强烈建议 (x.compareTo(y)==0) == (x.equals(y))

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VR全景广告——实体商家的营销新选择

前几年&#xff0c;大家出行不便&#xff0c;那个时候实体商家整天苦恼于没有客户&#xff0c;没有销量&#xff0c;一直到引入VR全景广告才算是有所好转。随着VR全景技术不断完善&#xff0c;许多行业、领域开始结合VR全景&#xff0c;例如景区、房地产、车企等都会利用VR全景…

「程序员必须掌握的算法」双指针「上篇」

双指针&#xff08;Two Pointers&#xff09;是解决算法问题的常用方法之一&#xff0c;它通过维护两个指针在某个序列中游走来解决问题。最常见的双指针问题是在一个有序数组中查找是否存在两个数的和等于目标值。 具体来说&#xff0c;设一个指针 left 初始指向数组第一个元…

解决nexus3登录x509: certificate has expired or is not yet valid

笔者前面的博文使用nexus3作为Docker镜像仓库介绍了如何使用nexus3来作为容器的镜像仓库,在生成证书时,使用了有效期限。如果证书过期了,使用podman或者docker登录,则会提示类似如下的信息: x509: certificate has expired or is not yet valid: current time 2023-09-12…

CMS-织梦[dede]-通用免登发布插件

CMS-织梦[dede]-通用免登发布插件 1. 织梦通用免登陆发布插件功能说明2. 织梦通用免登陆发布接口使用说明2-1 下载插件2-2 安装插件3 对接火车头等采集工具 3 爬虫【古诗文网】示例[可选]测试火车头入库模型 使用火车头&#xff0c;简数采集器&#xff0c;八爪鱼等文章采集工具…

构造函数注入指定bean名称

配置类 Configuration public class ThreadPoolTaskExecutorConfig {Beanpublic ThreadPoolTaskScheduler syncScheduler() {ThreadPoolTaskScheduler syncScheduler new ThreadPoolTaskScheduler();syncScheduler.setPoolSize(10);syncScheduler.setThreadGroupName("s…

智慧公厕助推城市管理智能化和治理精细化

随着城市化进程的不断加快&#xff0c;城市管理面临着诸多挑战和问题。而智慧公厕作为城市数字化赋能的重要一环&#xff0c;正成为推动城市管理智能化和治理精细化的关键力量。本文将以智慧公厕头部厂家广州中期科技有限公司&#xff0c;所实施大量精品案例项目的实景实图&…

【深度学习】 Python 和 NumPy 系列教程(二):Python基本数据类型:3、字符串(索引、切片、运算、格式化)

目录 一、前言 二、实验环境 三、Python基本数据类型 3. 字符串&#xff08;Strings&#xff09; 1. 初始化 2. 索引 3. 切片 4. 运算 a. 拼接运算 b. 复制运算 c. 子串判断 d. 取长度 5. 格式化 a. 使用位置参数 b. 使用关键字参数 c. 使用属性访问 f-string…

【linux命令讲解大全】076.pgrep命令:查找和列出符合条件的进程ID

文章目录 pgrep补充说明语法选项参数实例 从零学 python pgrep 根据用户给出的信息在当前运行进程中查找并列出符合条件的进程ID&#xff08;PID&#xff09; 补充说明 pgrep 命令以名称为依据从运行进程队列中查找进程&#xff0c;并显示查找到的进程ID。每一个进程ID以一个…

计算机毕设之基于Hadoop+springboot的物品租赁系统的设计与实现(前后端分离,内含源码+文档+教程)

该系统基于Hadoop平台&#xff0c;利用Java语言、MySQL数据库&#xff0c;结合目前流行的 B/S架构&#xff0c;将物品租赁管理的各个方面都集中到数据库中&#xff0c;以便于用户的需要。在确保系统稳定的前提下&#xff0c;能够实现多功能模块的设计和应用。该系统由管理员功能…

Mybatis 框架 ( 四 ) QueryWrapper

4.5.Wrapper条件构造器 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper &#xff1a; Entity 对象封装操作类&#xff0c;不是用lambda语法 UpdateWrapper &am…

android注解之APT和javapoet

前言 前面我们已经讲过注解的基本知识&#xff0c;对于注解还不太了解的&#xff0c;可以去看一下之前的文章&#xff0c; android 注解详解_袁震的博客-CSDN博客。 之前我们在讲注解的时候&#xff0c;提到过APT和JavaPoet&#xff0c;那么什么是APT和JavaPoet呢&#xff1…

【Mysql】Mysql获取排班时间段中的休息时间段方法

在MySQL中&#xff0c;可以使用自连接&#xff08;self-join&#xff09;来获取上一条记录的结束时间和下一条记录的开始时间&#xff0c;并将它们组合成一条记录。首先&#xff0c;需要为表创建一个包含记录ID和时间信息的临时表&#xff0c;然后使用自连接获取相邻记录的时间…

【面试经典150 | 数组】移除元素

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;原地操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等…

华为OD机试真题【篮球比赛】

1、题目描述 【篮球比赛】 一个有N个选手参加比赛&#xff0c;选手编号为1~N&#xff08;3<N<100&#xff09;&#xff0c;有M&#xff08;3<M<10&#xff09;个评委对选手进行打分。 打分规则为每个评委对选手打分&#xff0c;最高分10分&#xff0c;最低分1分。…

【STM32】常用存储器

常用存储器 RAM 存储器 RAM 是“Random Access Memory”的缩写&#xff0c;被译为随机存储器。所谓“随机存取”&#xff0c;指的是当存储器中的消息被读取或写入时&#xff0c;所需要的时间与这段信息所在的位置无关。而RAM可随读取其内部任意地址的数据&#xff0c;时间都是…

若依框架i18n国际化

需求背景 项目需求要做国际化&#xff0c;结果网上找了好几篇文章&#xff0c;没有一个可以一次性搞定&#xff0c;现在这里总结一下。首先&#xff0c;我们分为两部分处理&#xff0c;一个是前端页面的静态文字&#xff0c;这个由前端vue.json自行处理。第二部分就是后端的错…

Qt下SVG格式图片应用

SVG格式图片介绍 svg格式图片又称矢量图&#xff0c;该种格式的图片不同于png等格式的图片&#xff0c;采用的并不是位图的形式来组织图片&#xff0c;而是采用线条等组织图片&#xff0c;svg格式是图片的文件格式是xml&#xff0c;可以通过文件编译器打开查看svg格式内容。 …

使用Vagrant创建和管理本地Kubernetes(K8s)集群的步骤是什么

文章目录 步骤1&#xff1a;准备环境步骤2&#xff1a;创建Vagrantfile步骤3&#xff1a;启动虚拟机步骤4&#xff1a;安装Kubernetes步骤5&#xff1a;配置Kubernetes网络插件步骤6&#xff1a;将Worker节点加入集群步骤7&#xff1a;验证集群步骤8&#xff1a;部署应用步骤9&…

综合续航达1040公里:腾势计划2024年在香港上市,售价60-100 万

腾势汽车表示&#xff0c;他们计划于2024年在香港地区上市全新的D9车型。这款中大型高端新能源MPV是通过DM-i超级混动技术打造的&#xff0c;由于综合续航能力达到1040公里&#xff0c;且纯电续航最大可达190公里&#xff0c;这款车已经引起了广泛关注。据腾势销售事业部总经理…