• 帮助
    • 博客
    • 相册
    • 网盘
    • 超市
    • Xer吧
  • 登录
  • 注册
【调查】网盘升级,您希望增加哪些功能?    【公告】X5dj网络硬盘升级公告(更新)    【公告】X5dj网站网络硬盘用户使用协议    【公告】关于定期清理长期未登录网站的用户网盘文件的通知    【公告】十一,精彩一路随行---X5dj半月刊2008年第18期上线    【公告】一边DIY,一边赚积分!--模板DIY共享功能上线!    【公告】新增用户操作记录展示功能,帮助您更好的与朋友们互动    【公告】X5dj新功能汇总贴:新增“密码目录”功能上线    【公告】X5dj.com相册/网盘上传工具发布    
  • ironlong的心情驿站
  • http://www.x5dj.com/ironlong 复制地址
  • 首页

  • 博客

  • 相册

  • 网盘

  • 人际关系网

loading...
dom/sax比较 < 上一篇 下一篇 > Hibernate里为什么要重写hashcode()和equals()这两个方法?
重写自己的hashcode()方法
ironlong 发表于: 2008-03-25 21:39 来源:转载  X度:0  浏览:(147)  评论:(0)
收藏 | 复制地址 | [举报此文章] |  大 中 小 |  引用 删除 修改

 

HashMap是基于HashCode的,在所有对象的超类Object中有一个HashCode()方法, 但是它和equals方法一样,并不能适用于所有的情况,这样我们就需要重写自己的HashCode()方法。
下面就举这样一个例子:
import java.util.*; 
public class Exp2 { 
     public static void main(String[] args){ 
          HashMap h2=new HashMap(); 
          for(int i=0;i< 10;i++) 
               h2.put(new Element(i), new Figureout()); 
          System.out.println("h2:"); 
          System.out.println("Get the result for Element:"); 
          Element test=new Element(5); 
          if(h2.containsKey(test)) 
               System.out.println((Figureout)h2.get(test)); 
          else 
               System.out.println("Not found"); 
     } 
} 
class Element{ 
     int number; 
     public Element(int n){ 
          number=n; 
     } 
} 

class Figureout{ 
     Random r=new Random(); 
     boolean possible=r.nextDouble()>0.5; 
     public String toString(){ 
          if(possible) 
               return "OK!"; 
          else 
               return "Impossible!"; 
     } 
} 
      在这个例子中,Element用来索引对象Figureout,也即Element为key,Figureout为value。 在Figureout中随机生成一个浮点数,如果它比0.5大,打印“OK!”,否则打印“Impossible!”。 之后查看Element(5)对应的Figureout 结果如何。 
    结果却发现,无论你运行多少次,得到的结果都是“Not found”。也就是说索引Element(5)并不在HashMap中。这怎么可能呢?
     原因得慢慢来说:Element的HashCode方法继承自Object,而Object中的HashCode方法返回的HashCode对应于当前的地址,也就是说对于不同的对象,即使它们的内容完全相同,用HashCode()返回的值也会不同。这样实际上违背了我们的意图。因为我们在使用 HashMap时, 希望利用相同内容的对象索引得到相同的目标对象,这就需要HashCode()在此时能够返回相同的值。 

<****** type=text/java******> <****** src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/java******>

    在上面的例子中,我们期望new Element(i) (i=5)与 Element test=new Element(5)是相同的, 而实际上这是两个不同的对象,尽管它们的内容相同,但它们在内存中的地址不同。因此很自然的, 上面的程序得不到我们设想的结果。下面对 Element类更改如下:
class Element{ 
  int number; 
  public Element(int n){ 
    number=n; 
 } 
  public int hashCode(){ 
   return number; 
  } 
  public boolean equals(Object o){ 
   return (o instanceof Element) && (number==((Element)o).number); 
  } 
} 
       在这里Element覆盖了Object中的hashCode()和equals()方法。覆盖hashCode()使其以number的值作为 hashcode返回,这样对于相同内容的对象来说它们的hashcode也就相同了。而覆盖equals()是为了在HashMap判断两个key是否相等时使结果有意义(有关重写equals()的内容可以参考我的另一篇文章《重新编写Object类中的方法 》)。修改后的程序运行结果如下:
h2: 
Get the result for Element: 
Impossible! 
请记住:如果你想有效的使用HashMap,你就必须重写在其的HashCode()。
还有两条重写HashCode()的原则:
     不必对每个不同的对象都产生一个唯一的hashcode,只要你的HashCode方法使get()能够得到put()放进去的内容就可以了。即“不为一原则”。 生成hashcode的算法尽量使hashcode的值分散一些, 不要很多hashcode都集中在一个范围内,这样有利于提高 HashMap的性能。即“分散原则”。 至于第二条原则的具体原因,有兴趣者可以参考Bruce Eckel的《Thinking in Java》,
在那里有对HashMap内部实现原理的介绍,这里就不赘述了。
     掌握了这两条原则,你就能够用好HashMap编写自己的程序了。不知道大家注意没有, java.lang.Object中提供的三个方法:clone (),equals()和hashCode()虽然很典型, 但在很多情况下都不能够适用,它们只是简单的由对象的地址得出结果。 这就需要我们在自己的程序中重写它们,其实java类库中也重写了千千万万个这样的方法。 利用面向对象的多态性——覆盖,Java的设计者很优雅的构建了Java的结构,也更加体现了Java是一门纯OOP语言的特性。
   Java提供的Collection和Map的功能是十分强大的,它们能够使你的程序实现方式更为灵活, 执行效率更高。希望本文能够对大家更好的使用HashMap有所帮助。

转贴于 考试大 http://www.examda.com

 

 
系统分类:科技·IT
标签:科技   IT   
推送: 无分类 归类:综合

热爱篮球...热爱摇滚...
 
dom/sax比较 < 上一篇 下一篇 > Hibernate里为什么要重写hashcode()和equals()这两个方法?
用户回复
首页 上一页 1 下一页 尾页 共 1 页
评分与快速回复

博主推荐
  • · 30极品美女!作为礼物送给大家!
相关文章
  • ·盗版黑屏怎么办 怎样去掉正版验证
  • ·微软验证盗版 盗版windows黑屏
  • ·系统清理
  • ·系统清理
  • ·DHCP服务器
  • ·微软:正版验证每小时黑屏是善意提醒
  • ·出租游戏专用服务器!专业游戏一条龙服务 诚心的加QQ :574564121
  • ·出租游戏专用服务器!专业游戏一条龙服务 诚心的加QQ :574564121
  • ·出租游戏专用服务器!专业游戏一条龙服务 诚心的加QQ :574564121
  • ·出租游戏专用服务器!专业游戏一条龙服务 诚心的加QQ :574564121
  • ·出租游戏专用服务器!专业游戏一条龙服务 诚心的加QQ :574564121
  • ·出租游戏专用服务器!专业游戏一条龙服务 诚心的加QQ :574564121
  • ·中国E网科技(www.e-widc.com)招收虚拟主机代理 坐在家里赚钱不是在梦
  • ·中国E网科技(www.e-widc.com)招收虚拟主机代理 坐在家里赚钱不是在梦
  • ·中国E网科技(www.e-widc.com)招收虚拟主机代理 坐在家里赚钱不是在梦
  • ·中国E网科技(www.e-widc.com)招收虚拟主机代理 坐在家里赚钱不是在梦
  • ·中国E网科技(www.e-widc.com)招收虚拟主机代理 坐在家里赚钱不是在梦
  • ·中国E网科技(www.e-widc.com)招收虚拟主机代理 坐在家里赚钱不是在梦
  • ·中国E网科技(www.e-widc.com)招收虚拟主机代理 坐在家里赚钱不是在梦
  • ·中国E网科技(www.e-widc.com)招收虚拟主机代理 坐在家里赚钱不是在梦
博友热推
  • 网盘升级,您希望增加哪些功能?
  • X5dj网络硬盘升级公告(更新)
  • 真正的自我,就是要敢于放弃自我
  • 人在压力之下,真的会失声痛哭吗
  • 爱的信与不信,有时很难把握权衡
  • 兔斯基都说了,孤独就是一种态度
  • 人生种种皆为梦,数十年后尽化空
  • 一个简单的教育方式让我困惑至今
  • 为什么故事的结局总是那么完美呢
  • 社会是可以改造,但历史不容改变
关于我们 | X5dj动态 | 加入我们 | 友情链接 | 官方日志 | 免责声明 | 举报不良信息
北京开创明天科技有限公司 版权所有 京ICP证040979号