《Effective Java》—— 对于所有对象都通用的方法
2016-09-27 18:08
381 查看
本节主要涉及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 -- 2 对于所有对象都通用到方法
- 《Effective Java》——学习笔记(对于所有对象都通用的方法&类和接口)
- Effective Java 03 对于所有对象都通用的方法
- Effective Java:对于所有对象都通用的方法
- 《Effective java》学习笔记 2 之 对于所有对象都通用的方法
- 《Effective Java》:对于所有对象都通用的方法
- 《Effective Java》 第二讲:对于所有对象都通用的方法
- Effective Java Note(对于所有对象都通用的方法)
- 《effective java》读书笔记2(对于所有对象都通用的方法)
- Effective Java - 对于所有对象都通用的方法 - 始终要覆盖 toString
- Effective Java系列读后感(二)-对于所有对象都通用的方法
- 《Effective Java》第3章 对于所有对象都通用的方法
- 【读书笔记】《Effective Java》(2)--对于所有对象都通用的方法
- effective java(对于所有对象都通用的方法)
- 《Effective Java》第3章 对于所有对象都通用的方法
- Effective Java(二) 对于所有对象都通用的方法
- effective java-读书笔记-第三章 对于所有对象都通用的方法
- Effective Java - 对于所有对象都通用的方法 - 覆盖 equals 时请总要覆盖 hashCode
- 《Effective Java》读书笔记(二)之对于所有对象都通用的方法