目录
- 重写equals方法时遵守通用约定
- 重写equals方法时同时也要重写hashcode方法
- 始终重写 toString 方法
- 谨慎地重写 clone 方法
- 考虑实现Comparable接口
所有对象的通用方法
重写equals方法时遵守通用约定
- 重写equals需要满足以下几点
- 自反性:对于非null对象x,有x.equals(x) == true.
- 对称性:在x.equals(y)为true的同时必须y.equals(x)也为true
- 传递性:x.equals(y),y.equals(z)都为true,则x.equals(z)为true
- 一致性:如果x.equals(y)为true,那么在x,y被修改之前,x.equals(y)一直为true。也就是说对于不可变对象x,y,x.equals(y)结果始终一致。eg: 一个url如果只判断url的字符串是否相等那是可靠的,但是如果要先通过url获取资源在判断是否相等那就是不可靠的。
- 非空性:所有对象必须不能和null相等。
- 啥时候不需要从写equeals
- 类不需要提供一个“逻辑相等(logical equality)”的测试功能
- 类是私有的或包级私有的,可以确定它的equals方法永远不会被调用。
重写equals方法时同时也要重写hashcode方法
Object 规范,以下为具体约定:
- 如果两个对象根据equals(Object)方法比较是相等的,那么在两个对象上调用hashCode就必须产生的结果是相同的整数。
- 如果两个对象根据equals(Object)方法比较并不相等,则不要求在每个对象上调用hashCode都必须产生不同的结果。 但是,程序员应该意识到,为不相等的对象生成不同的结果可能会提高散列表(hash tables)的性能
- 违反条例时,则相等的对象放到mp里面,取不到数据。
始终重写 toString 方法
- 虽然Object类提供了toString方法的实现,但它返回的字符串通常不是你的类的用户想要看到的。 它由类名后跟一个“at”符号(@)和哈希码的无符号十六进制表示组成,例如PhoneNumber@163b91。
谨慎地重写 clone 方法
- 虽然实现Cloneable接口对于final类没有什么危害,但应该将其视为性能优化的角度,仅在极少数情况下才是合理的(条目67)。 通常,复制功能最好由构造方法或工厂提供。 这个规则的一个明显的例外是数组,它最好用 clone方法复制
- ArrayList实现深拷贝,实现Cloneable接口,然后
public Object clone() {
try {
ArrayList<?> v = (ArrayList<?>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError(e);
}
}
考虑实现Comparable接口
- compareTo不必跨越不同类型的对象:当遇到不同类型的对象时,compareTo被允许抛出ClassCastException异常.
- 无论何时实现具有合理排序的值类,你都应该让该类实现Comparable接口
网友评论