美文网首页
第三章所有对象的通用方法

第三章所有对象的通用方法

作者: 后来丶_a24d | 来源:发表于2020-03-11 11:02 被阅读0次

目录

  • 重写equals方法时遵守通用约定
  • 重写equals方法时同时也要重写hashcode方法
  • 始终重写 toString 方法
  • 谨慎地重写 clone 方法
  • 考虑实现Comparable接口

所有对象的通用方法

重写equals方法时遵守通用约定

  • 重写equals需要满足以下几点
  1. 自反性:对于非null对象x,有x.equals(x) == true.
  2. 对称性:在x.equals(y)为true的同时必须y.equals(x)也为true
  3. 传递性:x.equals(y),y.equals(z)都为true,则x.equals(z)为true
  4. 一致性:如果x.equals(y)为true,那么在x,y被修改之前,x.equals(y)一直为true。也就是说对于不可变对象x,y,x.equals(y)结果始终一致。eg: 一个url如果只判断url的字符串是否相等那是可靠的,但是如果要先通过url获取资源在判断是否相等那就是不可靠的。
  5. 非空性:所有对象必须不能和null相等。
  • 啥时候不需要从写equeals
  1. 类不需要提供一个“逻辑相等(logical equality)”的测试功能
  2. 类是私有的或包级私有的,可以确定它的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接口

参考文章

相关文章

网友评论

      本文标题:第三章所有对象的通用方法

      本文链接:https://www.haomeiwen.com/subject/xmkqjhtx.html