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

    覆盖equb时请遵循通用约定: 自反性.对于任何非null的引用值x,xequals(x)必须返回true. 对称性.对于任何非null的引用值x和y,当且晋档y.equals(x)返回true的时候 ...

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

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

  3. [Effective Java]第三章 对所有对象都通用的方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. [Effective Java 读书笔记] 第三章 对所有对象都通用的方法 第八 ---- 九条

    这一章主要讲解Object类中的方法, Object类是所有类的父类,所以它的方法也称得上是所有对象都通用的方法 第八条 覆盖equals时需要遵守的约定 Object中的equals实现,就是直接对 ...

  5. Java高效编程之二【对所有对象都通用的方法】

    对于所有对象都通用的方法,即Object类的所有非final方法(equals.hashCode.toString.clone和finalize)都有明确的通用约定,都是为了要被改写(override ...

  6. 《Effective Java》第3章 对于所有对象都通用的方法

    第8条:覆盖equals时请遵守通用约定 覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每 ...

  7. Effective Java读书笔记——第三章 对于全部对象都通用的方法

    第8条:覆盖equals时请遵守通用的约定 设计Object类的目的就是用来覆盖的,它全部的非final方法都是用来被覆盖的(equals.hashcode.clone.finalize)都有通用约定 ...

  8. [Java读书笔记] Effective Java(Third Edition) 第 3 章 对于所有对象都通用的方法

    第 10 条:覆盖equals时请遵守通用约定 在不覆盖equals方法下,类的每个实例都只与它自身相等. 类的每个实例本质上都是唯一的. 类不需要提供一个”逻辑相等(logical equality ...

  9. 《Effective Java》读书笔记 - 3.对于所有对象都通用的方法

    Chapter 3 Methods Common to All Objects Item 8: Obey the general contract when overriding equals 以下几 ...

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

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

随机推荐

  1. 16.iOS APP图标和启动画面尺寸

    1. 桌面图标 (app icon) for iPhone6 plus(@3x) : 180 x 180 for iPhone 6/5s/5/4s/4(@2x) : 120 x 120 2. 系统搜索 ...

  2. js如何判断手机机型

    <script language="javascript"> window.onload = function () { alert("1"); v ...

  3. 【线段树套平衡树】【pb_ds】bzoj3196 Tyvj 1730 二逼平衡树

    线段树套pb_ds里的平衡树,在洛谷OJ上测试,后三个测试点TLE #include<cstdio> #include<algorithm> #include<ext/p ...

  4. tomee 消息持久化

    http://tomee.apache.org/jms-resources-and-mdb-container.html http://activemq.apache.org/xml-configur ...

  5. Bootstrap的安装

    在了解了HTML和CSS.JS之后,我咨询了之前做过这一块的学长,得知了Bootstrap的存在. Bootstrap (Web前端CSS框架) Bootstrap,来自 Twitter,是目前很受欢 ...

  6. Web Workers

    在 Web Workers 中使用 postMessage 和 onmessage 首先,需要在客户端页面的 JavaScript 代码中 new 一个 Worker 实例出来,参数是需要在另一个线程 ...

  7. 修改mysql某一键为自增键

    alter table tb_name modify id int auto_increment primary key

  8. hdu 3951 - Coin Game(找规律)

    这道题是有规律的博弈题目,,, 所以我们只需要找出规律来就ok了 牛人用sg函数暴力找规律,菜鸟手工模拟以求规律...[牢骚] if(m>=2) { if(n<=m) {first第一口就 ...

  9. STM32串口接收不定长数据原理与源程序(转)

    今天说一下STM32单片机的接收不定长度字节数据的方法.由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的A ...

  10. windows下在文件夹中快速启动cmd

    在windows下,有时候由于特定需要,我们经常需要将cmd  cd到某文件下进行命令行操作,其实,这里有一个小技巧: 在一个文件下,按住shift键,然后点击鼠标右键,你就会发现菜单栏中多出一个“在 ...