



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hashcode的作用文章分类:Java编程 = 改写equals时总是要改写hashCode=java.lnag.Object中对hashCode的约定: 1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。 2. 如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。 3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。 有一个概念要牢记,两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象。所以hashcode相等只能保证两个对象在一个HASH表里的同一条HASH链上,继而通过equals方法才能确定是不是同一对象,如果结果为true, 则认为是同一对象不在插入,否则认为是不同对象继续插入。Object的代码:public String toString () return this.getClass().getName() + + Integer.toHexString(this.hashCode();public boolean equals (Object o) return this = o;/* Answers an integer hash code for the receiver. Any two* objects which answer true when passed to* .equals must answer the same value for this* method.* author OTI* version initial* return int* the receivers hash.* see #equals*/public native int hashCode();从上面我们可以看到是否很可能Object.hashCode就是代表内存地址。下面我们来证明hashcode是不是真的就是Object的内存地址呢?实际上,hashcode根本不能代表object的内存地址。-Object.hashCode不可以代表内存地址-package com.tools;import java.util.ArrayList;/* 此方法的作用是证明 java.lang.Object的hashcode 不是代表 对象所在内存地址。* 我产生了10000个对象,这10000个对象在内存中是不同的地址,但是实际上这10000个对象* 的hashcode的是完全可能相同的*/public class HashCodeMeaning public static void main(String args) ArrayList list = new ArrayList(); int numberExist=0; /证明hashcode的值不是内存地址 for (int i = 0; i 10000; i+) Object obj=new Object(); if (list.contains(obj.toString() System.out.println(obj.toString() + exists in the list. + i); numberExist+; else list.add(obj.toString(); System.out.println(repetition number:+numberExist); System.out.println(list size:+list.size(); /证明内存地址是不同的。 numberExist=0; list.clear(); for (int i = 0; i 10000; i+) Object obj=new Object(); if (list.contains(obj) System.out.println(obj + exists in the list. + i); numberExist+; else list.add(obj); System.out.println(repetition number:+numberExist); System.out.println(list size:+list.size(); =看HashTable的源代码非常有用:= = 有效和正确定义hashCode()和equals():= 级别:入门级每个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()情况又将如何?如果我们从未在HashMap或其它基于散列的集合中使用Integer作为关键字的话,什么也不会发生。但是,如果我们在HashMap中使用这类Integer对象作为关键字,我们将不能够可靠地检索相关的值,除非我们在get()调用中使用与put()调用中极其类似的Integer实例。这要求确保在我们的整个程序中,只能使用对应于特定整数值的Integer对象的一个实例。不用说,这种方法极不方便而且错误频频。Object的interface contract要求如果根据 equals()两个对象是相等的,那么它们必须有相同的hashCode()值。当其识别能力整个包含在equals()中时,为什么我们的根对象类需要hashCode()?hashCode()方法纯粹用于提高效率。Java平台设计人员预计到了典型Java应用程序中基于散列的集合类(Collection Class)的重要性-如Hashtable、HashMap和HashSet,并且使用equals()与许多对象进行比较在计算方面非常昂贵。使所有Java对象都能够支持 hashCode()并结合使用基于散列的集合,可以实现有效的存储和检索。=Go deep into HashCode:=为什么HashCode对于对象是如此的重要?一个对象的HashCode就是一个简单的Hash算法的实现,虽然它和那些真正的复杂的Hash算法相比还不能叫真正的算法,但如何实现它,不仅仅是程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 12克服胆怯(教学设计)-大象版心理健康四年级
- 第四单元第1课 身临其境 说课稿-2024-2025学年人教版(2024)初中美术七年级上册
- 第六课 成功贵在坚持说课稿-2025-2026学年小学心理健康川教版五年级上册-川教版
- 2025年高考生物试题分类汇编植物生命活动的调节(解析版)
- 2025年审计专业知识考试题及答案
- 2025年高考生物试题分类汇编:群落及其演替解析版
- 葡萄酒美容知识培训课件
- 小班科学连线题目及答案
- 2025经理聘用合同的范文
- 项目论文题目及答案范文
- 2025山西晋中昔阳县文化旅游发展有限责任公司社会招聘15人笔试备考题库及答案解析
- 成人2型糖尿病口服降糖药联合治疗专家共识解读 2
- 入职岗前培训之工会知识课件
- 媒介融合传播概论课件
- 2025年总工会招聘考试工会知识模拟试卷及答案
- 2025年基层卫生人才能力提升培训(乡村医生理论培训考试题及答案)
- 统编版新版三年级上册道德与法治教学计划及进度表
- 2026年高考第一轮复习数学第01讲 导数的概念及其意义、导数的运算(复习课件)
- 2025年工会财务知识竞赛考试题库及参考答案
- 《火力发电企业电力监控系统商用密码应用技术要求》
- 基层管理员工管理办法
评论
0/150
提交评论