本节主要涉及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》—— 对于所有对象都通用的方法相关推荐

  1. Effective Java 对于所用对象都通用的方法 8.覆盖equals时请遵守通用约定.txt

    对于eclipse覆盖equals方法就是Alt+Shift+S,而AS就是Alt+Insert.覆盖很简单,可是却容易导致错误,而且后果很严重.最容易避免的方法就是不覆盖,这样类就只与他自身相等. ...

  2. Effective Java:对于全部对象都通用的方法

    前言: 读这本书第1条规则的时候就感觉到这是一本非常好的书.可以把我们的Java功底提升一个档次,我还是比較推荐的.这里我主要就关于覆盖equals.hashCode和toString方法来做一个笔记 ...

  3. Effective Java:对于所有对象都通用的方法

    前言: 读这本书第1条规则的时候就感觉到这是一本很好的书,可以把我们的Java功底提升一个档次,我还是比较推荐的.这里我主要就关于覆盖equals.hashCode和toString方法来做一个笔记总 ...

  4. 《Effective Java》 第二讲:对于所有对象都通用的方法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 上接<Effective Java> 第一讲:创建和销毁对象 八.覆盖 equals 时 ...

  5. 2.对于所有对象都通用的方法_EJ

    第8条: 覆盖equals时请遵守通用约定 我们在覆盖equals方法时,必须遵守它的通用约定: 1.自反性.对于任何非null的引用值x,x.equals(x)必须返回true: 2.对称性.对于任 ...

  6. Effective java -- 2 对于所有对象都通用到方法

    第八条:覆盖equals时请遵守通用约定 什么时候需要覆盖equals方法?类具有自己的逻辑相等概念,并且父类的equals方法不能满足需要. 重写equals时需要遵循一下约定: 自反性:非null ...

  7. java 通用对象_java中对所有对象都通用的方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 覆盖equals时请遵守通用约定 我们知道equals要实现的是逻辑上的相等.站在数学的角度来看,两个事物相等的条件,有如下几个: 1.自反性:对于任何非 ...

  8. java 匿名list,java创造匿名对象的两种方法

    在java中有时候需要一些匿名对象的使用.可能有些小伙伴拿还不会创造,其实我们在学习一些方法时都或多或少的接触过.本篇所要讲到的创造匿名对象总结了两种方法,分别是静态工具方法和Lambda表达式,我们 ...

  9. Effective Java读书笔记四:通用程序设计

    第45条:将局部变量的作用域最小化 在第一次使用变量时的地方声明: 几乎每个局部变量的声明都应该包含一个初始表达式: 如果在终止循环之后不需要循环变量的内容,for循环优于while循环.(for循环 ...

最新文章

  1. 图解排序算法之3种简单排序(选择,冒泡,直接插入)
  2. withCredentials--相同主域跨域解决方法
  3. DELL服务器重做RAID
  4. 训练loss不下降原因集合
  5. python charm下载安装教程-Python及Pycharm安装方法图文教程
  6. python装饰器-python装饰器简介---这一篇也许就够了(推荐)
  7. 关于团队建设,穆帅能教我们什么?
  8. 同样是程序员,优秀的程序员能够月入5万甚至50万!,一般的程序员却只能月入5千甚至更低?那么他们差别在哪里呢?
  9. 编写函数求字母出现次数c语言,c语言,程序设计题,输入一个字符串,统计该字符串中the出现次数。...
  10. html5制作线路图,HTML5绘制上海地铁线路图
  11. 用Lucene建立搜索索引
  12. Adobe AIR for Android 缓存本地数据常用方法
  13. AcWing 875. 快速幂
  14. 078、Docker 最常用的监控方案(2019-04-25 周四)
  15. 怎么用谷歌学术检索下载外文文献
  16. windows 7 RC(7106.0.090408)下载另附windows7驱动收集整合(5月31日更新)
  17. 用PROC FCMP创建函数
  18. 如何正确认识和提升自己的格局
  19. Deltix宣布CryptoCortex与MPC钱包提供商Curv整合
  20. 不浪费原料的汉堡制作方案--贪心算法

热门文章

  1. chmod与umask区分命令
  2. SVN更新的时候报断言失败解决办法
  3. UI基础:UILabel.UIFont
  4. VMware虚拟机与宿主无法复制的解决办法
  5. JavaScript操作表格进行拖拽排序
  6. 序列化与反序列化(1)Serializable —— Java原生态方法
  7. 安装ubuntu20.04(安装vim、gcc、VMtools、中文输入法、汉化、修改IP地址)
  8. Linux网络编程(Socket)
  9. java跟踪会话_JavaWeb会话跟踪
  10. docker ps命令详解 列出运行中的容器