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

   级别:入门级

   Brian Goetz (brian@quiotix.com)
   Quiotix Corp首席顾问
   2003 年 8 月

   每个Java对象都有hashCode()和 equals()方法。许多类忽略(Override)这些方法的缺省实施,以在对象实例之间提供更深层次的语义可比性。在Java理念和实践这一部分,Java开发人员Brian Goetz向您介绍在创建Java类以有效和准确定义hashCode()和equals()时应遵循的规则和指南。您可以在讨论论坛与作者和其它读者一同探讨您对本文的看法。(您还可以点击本文顶部或底部的讨论进入论坛。)

   虽然Java语言不直接支持关联数组 -- 可以使用任何对象作为一个索引的数组 -- 但在根Object类中使用hashCode()方法明确表示期望广泛使用HashMap(及其前辈Hashtable)。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式中支持散列可以促进基于散列的容器的开发和使用。

定义对象的相等性

   Object类有两种方法来推断对象的标识:equals()和hashCode()。一般来说,如果您忽略了其中一种,您必须同时忽略这两种,因为两者之间有必须维持的至关重要的关系。特殊情况是根据equals() 方法,如果两个对象是相等的,它们必须有相同的hashCode()值(尽管这通常不是真的)。

   特定类的equals()的语义在Implementer的左侧定义;定义对特定类来说equals()意味着什么是其设计工作的一部分。Object提供的缺省实施简单引用下面等式:

   public boolean equals(Object obj) { return (this == obj); }

   在这种缺省实施情况下,只有它们引用真正同一个对象时这两个引用才是相等的。同样,Object提供的hashCode()的缺省实施通过将对象的内存地址对映于一个整数值来生成。由于在某些架构上,地址空间大于int值的范围,两个不同的对象有相同的hashCode()是可能的。如果您忽略了hashCode(),您仍旧可以使用System.identityHashCode()方法来接入这类缺省值。

忽略 equals() -- 简单实例

   缺省情况下,equals()和hashCode()基于标识的实施是合理的,但对于某些类来说,它们希望放宽等式的定义。例如,Integer类定义equals() 与下面类似:

   public boolean equals(Object obj) {
   return (obj instanceof Integer
   && intValue() == ((Integer) obj).intValue());
   }

   在这个定义中,只有在包含相同的整数值的情况下这两个Integer对象是相等的。结合将不可修改的Integer,这使得使用Integer作为HashMap中的关键字是切实可行的。这种基于值的Equal方法可以由Java类库中的所有原始封装类使用,如Integer、Float、Character和Boolean以及String(如果两个String对象包含相同顺序的字符,那它们是相等的)。由于这些类都是不可修改的并且可以实施hashCode()和equals(),它们都可以做为很好的散列关键字。

为什么忽略 equals()和hashCode()?

   如果Integer不忽略equals() 和 hashCode()情况又将如何?如果我们从未在HashM

[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号