设为首页 加入收藏 网站首页
休闲娱乐
军事·社会百态·娱乐八卦·校园
体育·美女写真·幽默笑话·游戏
综合·在线视频·搞笑图片·灵异
两性生活
两性知识·性爱技巧
情色实录·两性图片
女性健康·同性之恋
电脑网络
网络编程·网页制作·软件教学
操作系统·图形图象·冲浪宝典
网络安全·邮件系统·认证考试
热点专题
芙蓉·真人漫画
72式·欲望都市
帅哥·人体彩绘
您现在的位置: 世纪中国 >> 认证考试 >> Java认证 >> 教程正文
有效和正确定义hashCode()和equals()
作者:中国图霸    教程来源:网络    点击数:    更新时间:2007-1-4
相等的。

   对于比较复杂的类来说,equals()和hashCode()的行为可能甚至受到superclass或interface的影响。例如,List接口要求如果并且只有另一个对象是List,而且它们有相同顺序的相同的Elements(由Element上的Object.equals() 定义),List对象等于另一个对象。hashCode()的需求更特殊--list的hashCode()值必须符合以下计算:

   hashCode = 1;
   Iterator i = list.iterator();
   while (i.hasNext()) {
   Object obj = i.next();
   hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
   }

   不仅仅散列值取决于list的内容,而且还规定了结合各个Element的散列值的特殊算法。(String类规定类似的算法用于计算String的散列值。)

编写自己的equals()和hashCode()方法

   忽略缺省的equals()方法比较简单,但如果不违反对称(Symmetry)或传递性(Transitivity)需求,忽略已经忽略的equals() 方法极其棘手。当忽略equals()时,您应该总是在equals()中包括一些Javadoc注释,以帮助那些希望能够正确扩展您的类的用户。

   作为一个简单的例子,考虑以下类:

   class A {
   final B someNonNullField;
   C someOtherField;
   int someNonStateField;
   }

   我们应如何编写该类的equals()的方法?这种方法适用于许多情况:

   public boolean equals(Object other) {
   // Not strictly necessary, but often a good optimization
   if (this == other)
   return true;
   if (!(other instanceof A))
   return false;
   A otherA = (A) other;
   return
   (someNonNullField.equals(otherA.someNonNullField))
   && ((someOtherField == null)
   ? otherA.someOtherField == null
   : someOtherField.equals(otherA.someOtherField)));
   }

   现在我们定义了equals(),我们必须以统一的方法来定义hashCode()。一种统一但并不总是有效的定义hashCode()的方法如下:

   public int hashCode() { return 0; }

   这种方法将生成大量的条目并显著降低HashMaps的性能,但它符合规范。一个更合理的hashCode()实施应该是这样:

   public int hashCode() {
   int hash = 1;
   hash = hash * 31 + someNonNullField.hashCode();
   hash = hash * 31
   + (someOtherField == null ? 0 : someOtherField.hashCode());
   return hash;
   }

上一页  [1] [2] [3] [4] 下一页

分类推荐
社会 社会 娱乐 军事 校园
幽默 体育 女性 专题
电脑 编程 网页 软件 系统
安全 图象 冲浪 认证
搞笑 人物 动物 物品 表情
签名 色图 漫画 奇闻
美女 明星 清纯 自拍 欧美
丝袜 卡通 性感 走光
两性 知识 性图 孕育 技巧
同性 单身 情感 实录
视频 写真 搞笑 MTV 翻唱
写实 片段 游戏 综艺
Java认证热门文章
普通教程 该学Java或.NET?
普通教程 Java认证介绍
普通教程 Sun认证Java开发员-SCJD认证介
普通教程 课程介绍(11)SL-351 Java数据库
普通教程 课程介绍(8)SL-425 体系结构及
普通教程 课程介绍(13)SL-291 JavaBeans
普通教程 课程介绍(12)SL-330 Java开发数
普通教程 课程介绍(9)SL-310 超越CGI 开
普通教程 课程介绍(7)SEM-SL-345 Java 2
普通教程 课程介绍(4)SL-275 Java语言编
普通教程 课程介绍(10)SL-315 Java Serv
普通教程 课程介绍(6)SL-285 高级Java编
普通教程 课程介绍(5)SL-314 用Java开发
普通教程 课程介绍(3)SL-265 结构化程序
普通教程 课程介绍(2)SL-210 向Java面向
普通教程 课程介绍(1)SL-110 初级Java语
普通教程 最新Sun授权ASEC-Java培训中心
普通教程 Java开发员认证
普通教程 Java:IT认证中最有魅力的开发工
普通教程 Java认证权威问答精华集

  广东广州海珠区 世纪网络工作室 版权所有 上海电信提供网络带宽
信箱: 9297659@qq.com 粤ICP备06113754号