快速业务通道

通过分析JDK源代码研究Hash存储机制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
als() 比较的标准。

通过分析JDK源代码研究Hash存储机制(7)

时间:2010-12-08 IBM 李刚

hashCode() 和 equals()

关于如何正确地重写某个类的 hashCode() 方法和 equals() 方法,请参考 疯狂 Java 体系的《疯狂 Java 讲义》一书中相关内容。

如下程序就正确重写了 Name 类的 hashCode() 和 equals() 方法,程序如 下:

class Name {    private String first;    private String last;    public Name(String first, String last)    {      this.first = first;      this.last = last;    }    // 根据 first 判断两个 Name 是否相等    public boolean equals(Object o)    {      if (this == o)      {        return true;      }      if (o.getClass() == Name.class)      {        Name n = (Name)o;        return n.first.equals(first);      }      return false;    }    // 根据 first 计算 Name 对象的 hashCode() 返回值    public int hashCode()    {      return first.hashCode();    }    public String toString()    {      return "Name[first=" + first + ", last=" + last +  "]";    }   }   public class HashSetTest2    {    public static void main(String[] args)    {      HashSet<Name> set = new HashSet<Name> ();      set.add(new Name("abc" , "123"));      set.add(new Name("abc" , "456"));      System.out.println(set);    } }

上面程序中提供了一个 Name 类,该 Name 类重写了 equals() 和 toString() 两个方法,这两个方法都是根据 Name 类的 first 实例变量来判断 的,当两个 Name 对象的 first 实例变量相等时,这两个 Name 对象的 hashCode() 返回值也相同,通过 equals() 比较也会返回 true。

程序主方法先将第一个 Name 对象添加到 HashSet 中,该 Name 对象的 first 实例变量值为"abc",接着程序再次试图将一个 first 为"abc"的 Name 对象添加到 HashSet 中,很明显,此时没法将新的 Name 对象添加到该 HashSet 中,因为此处试图添加的 Name 对象的 first 也是" abc",HashSet 会判断此处新增的 Name 对象与原有的 Name 对象相同,因此无法添加进入,程 序在①号代码处输出 set 集合时将看到该集合里只包含一个 Name 对象,就是 第一个、last 为"123"的 Name 对象。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号