• Effective java 第三章对于所有对象都通用的方法(一) 读书笔记


     对于所有对象都通用的方法

    覆盖equals时请遵守通用约定

    类的每个实例本质上都是唯一的。
    不关心类是否提供了逻辑相等的测试功能
    超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的。
    类是私有的或是包级私有的,可以确定它的equals方法永远不会被调用。
    throw new AssertionError()

    一般覆盖Object.equals都是值类
    但有一种值类不需要覆盖equals方法,即实例受控,确保每个值至多只存在一个对象的类。如枚举

    覆盖equals方法,通用约定。
    自反性
    对称性
    传递性
    一致性
    非空性

    里氏替换原理
    一个类型的任何重要属性也将适用于它的子类型。

    实现高质量equals方法的诀窍
    1.使用==操作符检查“参数是否为这个对象的引用”
    2.使用instanceof操作符检查“参数是否为正确的类型”
    3.把参数转换成正确的类型
    4.对于该类中的每个“关键域”,检查参数中的域是否与该对象中对应的域相匹配。

    覆盖equals时总要覆盖hashCode
    不要企图让equals方法过于智能
    不要将equals声明中的Object对象替换为其他的类型。

    覆盖equals时总要覆盖hashCode
    约定:
    在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法都必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。
    如果对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashaCode方法都必须产生同样的整数结果。
    如果两个对象根据equals(Object)方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生不同的整数结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表的性能。

    hash.put
    hash.get
    得不到

    编写一个合法但并不好用的hashCode方法没有任何价值

    在散列码的计算过程中,可以把冗余域排除在外。

  • 相关阅读:
    linux信号
    APM浅析
    Jackson高并发情况下,产生阻塞
    [转]slf4j 与log4j 日志管理
    2015-09-27 git学习
    MySQL学习笔记-锁相关话题
    MySQL学习笔记-MySQL数据库优化实践[转]
    MySQL学习笔记-事务相关话题
    几个关于网站架构和性能的问题(我在知乎上的问答)
    MySQL学习笔记-数据库文件
  • 原文地址:https://www.cnblogs.com/carrier/p/7266294.html
Copyright © 2020-2023  润新知