手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

高质量equals方法和HashCode

[日期:2016-09-16] 来源:Linux社区  作者:feixy [字体: ]

equals方法

  1. 使用==操作符检查“参数是否为当前对象的引用”,如果是,直接返回true;
  2. 使用instanceof 操作符检查“参数是否为正确的类型”。如果不是,直接返回false。(根据具体逻辑,此处可能需要使用==判断class);
  3. 将参数转换为正确的类型;
  4. 对于该类中的每个“关键”域,检查参数中的域是否与该对象中的鱼相匹配。对于既不是float和double类型的基本类型域,使用==比较;对于对象引用域,使用equals方法;对于float域,使用Float.compare;对于double域,使用Double.compare
 
注意点:
  • 覆盖equals时,总要覆盖hashcode;
  • 不要将equals(Object obj) 中的Object参数类型替换为其他的类型。

 
hashCode方法的散列函数:
    1. 把某个非零的常数值,比如17,保存在一个名为result的int类型变量中;
    2. 对于对象中的每个关键域f(指equals方法中涉及的每个域),完成以下步骤:
      1. 为该域计算int类型的散列码c:
        1. 如果该域是boolean类型,则计算(f?1:0);
        2. 如果该域是byte、short、char或者int类型,则计算(int)f;
        3. 如果该域是long类型,则计算(int)(f^(f>>>32));
        4. 如果该域是float类型,则计算Float.floatToIntBits(f);
        5. 如果该域是double类型,则计算Double.doubleToLongBits(f),然后按照步骤2.1.3,为得到的long类型计算散列值;
        6. 如果该域是一个对象引用,并且该类的equals方法通过递归的调用equals方式比较这个域,则通用为这个域递归的调用hashCode。
        7. 如果该域是一个数组,则要把每个元素当做单独的域来处理。
      2. 按照下面的公式,把步骤2.1中计算得到的散列码c合并到result中:
        result = 31*result + c;
    3. 返回result

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-09/135220.htm

linux
相关资讯       hashcode  equals 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款