《Effective Java》—— 对于所有对象都通用的方法
本节主要涉及Object中通用的一些方法,比如
equals
,hashCode
,toString
,clone
,finalize
等等
覆盖equals时请遵守通用约定
equals方法实现的等价关系:
- 自反性:对于所有的非null,a=a
- 对称性:a=b,则b=a
- 传递性:a=b,b=c,则a=c
- 一致性:对于没有被修改的ab,如果a=b,则一直a=b
- 非空性:对于任何非Null,a!=null
高质量equals方法的诀窍:
- 使用==操作符检查——“参数是否为这个对象的引用”
- 使用instanceof检查——“参数是否为正确的类型”
- 参数转换成正确的类型
- 对于每个关键域,检查参数中的域是否与对象的域相匹配
- 写完后,问自己:是否对称、是否传递、是否一致
忠告:
- 覆盖equlas时,总是覆盖hashCode
- 不要企图让equals过于智能
- 不要将equals中的Object对象换成其他的类型
@Override public boolean equals(Object o){if(o == this)return true;if(!(o instanceof XX))return false;XX xx = (XX)o;return xx.x.equals(o.x);//TODO
}
覆盖equals时总是要覆盖hashCode
hashCode主要用于放在HashMap,HashSet,HashTable中时,计算hash值。
@Override public int hashCode(){int result = 17;result = 31*result+eee;result = 31*result+xxx;return result;
}
其中17是随便写的,31是有说道的,因为31是个奇素数,并且:
31*i==(i<<5)-i
这样JVM在优化的时候效率会更高。
始终覆盖toString()
因为toString方法应该返回对象的关键信息
谨慎的覆盖clone
应该满足:
x.clone() != x
x.clone().getClass() == x.getClass()
x.clone().equals(x)
另外clone方法相当于另一种构建器,不应该对原来的对象产生影响。
考虑实现Comparable接口
常用的List等等可以通过实现Comparable接口进行排序:
public interface Comparable<T{int compareTo(T t);
}
当对象小于,等于或者大于时,应该返回一个负整数,零或者正整数。
《Effective Java》—— 对于所有对象都通用的方法相关推荐
- Effective Java 对于所用对象都通用的方法 8.覆盖equals时请遵守通用约定.txt
对于eclipse覆盖equals方法就是Alt+Shift+S,而AS就是Alt+Insert.覆盖很简单,可是却容易导致错误,而且后果很严重.最容易避免的方法就是不覆盖,这样类就只与他自身相等. ...
- Effective Java:对于全部对象都通用的方法
前言: 读这本书第1条规则的时候就感觉到这是一本非常好的书.可以把我们的Java功底提升一个档次,我还是比較推荐的.这里我主要就关于覆盖equals.hashCode和toString方法来做一个笔记 ...
- Effective Java:对于所有对象都通用的方法
前言: 读这本书第1条规则的时候就感觉到这是一本很好的书,可以把我们的Java功底提升一个档次,我还是比较推荐的.这里我主要就关于覆盖equals.hashCode和toString方法来做一个笔记总 ...
- 《Effective Java》 第二讲:对于所有对象都通用的方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 上接<Effective Java> 第一讲:创建和销毁对象 八.覆盖 equals 时 ...
- 2.对于所有对象都通用的方法_EJ
第8条: 覆盖equals时请遵守通用约定 我们在覆盖equals方法时,必须遵守它的通用约定: 1.自反性.对于任何非null的引用值x,x.equals(x)必须返回true: 2.对称性.对于任 ...
- Effective java -- 2 对于所有对象都通用到方法
第八条:覆盖equals时请遵守通用约定 什么时候需要覆盖equals方法?类具有自己的逻辑相等概念,并且父类的equals方法不能满足需要. 重写equals时需要遵循一下约定: 自反性:非null ...
- java 通用对象_java中对所有对象都通用的方法
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 覆盖equals时请遵守通用约定 我们知道equals要实现的是逻辑上的相等.站在数学的角度来看,两个事物相等的条件,有如下几个: 1.自反性:对于任何非 ...
- java 匿名list,java创造匿名对象的两种方法
在java中有时候需要一些匿名对象的使用.可能有些小伙伴拿还不会创造,其实我们在学习一些方法时都或多或少的接触过.本篇所要讲到的创造匿名对象总结了两种方法,分别是静态工具方法和Lambda表达式,我们 ...
- Effective Java读书笔记四:通用程序设计
第45条:将局部变量的作用域最小化 在第一次使用变量时的地方声明: 几乎每个局部变量的声明都应该包含一个初始表达式: 如果在终止循环之后不需要循环变量的内容,for循环优于while循环.(for循环 ...
最新文章
- 图解排序算法之3种简单排序(选择,冒泡,直接插入)
- withCredentials--相同主域跨域解决方法
- DELL服务器重做RAID
- 训练loss不下降原因集合
- python charm下载安装教程-Python及Pycharm安装方法图文教程
- python装饰器-python装饰器简介---这一篇也许就够了(推荐)
- 关于团队建设,穆帅能教我们什么?
- 同样是程序员,优秀的程序员能够月入5万甚至50万!,一般的程序员却只能月入5千甚至更低?那么他们差别在哪里呢?
- 编写函数求字母出现次数c语言,c语言,程序设计题,输入一个字符串,统计该字符串中the出现次数。...
- html5制作线路图,HTML5绘制上海地铁线路图
- 用Lucene建立搜索索引
- Adobe AIR for Android 缓存本地数据常用方法
- AcWing 875. 快速幂
- 078、Docker 最常用的监控方案(2019-04-25 周四)
- 怎么用谷歌学术检索下载外文文献
- windows 7 RC(7106.0.090408)下载另附windows7驱动收集整合(5月31日更新)
- 用PROC FCMP创建函数
- 如何正确认识和提升自己的格局
- Deltix宣布CryptoCortex与MPC钱包提供商Curv整合
- 不浪费原料的汉堡制作方案--贪心算法