本节主要涉及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. 时间管理的若干Tips

    时间管理的若干Tips 记下来 再好的记性也不如一支笔与一个本子. 买一支好点的笔于一个好点的本子,让自己有书写的欲望,将todo事项记下来. 小目标 太大太远的目标会使人气馁.通过将大目标分解再分解 ...

  2. 后台返回字符串类型function的处理 (递归算法)

    $(function(){ $.ajax({ type: "post", url: "${ctx}/modules/fos/reference/echart", ...

  3. 使用xtrabackup备份mysql数据库

    数据在一个企业里非常重要,因此经常需要备份数据库,确保出线故障时,可以立刻恢复数据到最新状态,目前常见的备份工具有mysqldump和xtrabackup,数据量较少时可以使用mysqldump,但随 ...

  4. pt_table_checksum对检查表的chunk大小的限制

    02-16T10:22:38 Skipping table xoxdb.tb_valuelog because on the master it would be checksummed in one ...

  5. Python读取文本,输出指定中文(字符串)

    因业务需求,需要提取文本中带有检查字样的每一行. 样本如下: 1 投入10kVB.C母分段820闭锁备自投压板 2 退出10kVB.C母分段820备投跳803压板 3 退出10kVB.C母分段820备 ...

  6. 安卓Notification的setLatestEventInfo is undefined出错不存在的解决

    用最新版的SDK,在做状态栏通知时,使用了Notification的setLatestEventInfo(),结果提示: The method setLatestEventInfo(Context, ...

  7. MFC学习随笔(1)

    最近在学习用MFC编写一个简单的界面.其实MFC并不是十分复杂的,经过一段时间的熟悉就可以实现许多基础功能.但是在编写的过程中,经常会遇到林林总总的bug,让人摸不到头脑.今天记录一个过去没有注意过的 ...

  8. python-getattr

    getattr(object, name[, default]) Return the value of the named attribute of object.  name must be a ...

  9. Runtime消息传送

    person.h #import<Foundation/Foundation.h> @interfacePerson :NSObject + (void)eat; - (void)run: ...

  10. lxc on centos

    终于把lxc的网络配通了,也不知道对不对,记一下 一开始都是雷同的地方 yum install libcgroup lxc lxc-templates 安装lxc cgroup 然后记得 chkcon ...