`
xiaotao.2010
  • 浏览: 217702 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

HashTable中解读hashCode

 
阅读更多
一篇学习笔记,忘与大家共勉,欢迎拍砖!

hashCode总是挂在嘴边的一词,每每没有去了解过,每次要用到的时候都是点击鼠标eclipse来自动生成。。。
作为回顾hashCode的一篇帖子,我在这里就把什么是hash给略掉,有疑问的留言就行了。直接从java中java.lang.Object.hashCode()开始。
Object类作为所有对象类的爸爸类,对象的hashCode()也是舶来爸爸的中的hashCode值,当然对象有权利重写hashCode()方法,给定本对象的hashCode的计算方法。
引用

引用 jdk6.zh_cn.chm

hashCode
public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)


返回:
此对象的一个哈希码值。
另请参见:
equals(java.lang.Object), Hashtable



从JDK对hashCode()的解释可以看出,对象的hashCode相等不一定说明对象相等即对象的equals()相等,但对象的equals()相等那么对象的hashCode一定相等,这里将哈希冲突渐渐地引出,在下面的HashTable中会提到哈希冲突和hashTable中解决哈希冲突的办法。

那从JDK源码中看看Object.hashCode()

    /*
     * As much as is reasonably practical, the hashCode method defined by 
     * class <tt>Object</tt> does return distinct integers for distinct 
     * objects. (This is typically implemented by converting the internal 
     * address of the object into an integer, but this implementation 
     * technique is not required by the 
     * Java<font size="-2"><sup>TM</sup></font> programming language.)
     *
     * @return  a hash code value for this object.
     * @see     java.lang.Object#equals(java.lang.Object)
     * @see     java.util.Hashtable
     */
       public native int hashCode();//注意这个native


看到这个代码,说个我好玩的事情,记得我第一次看到这段代码的时候我就很好奇为这么这个断代码没有具体实现方法,自己做了很多次得到Object得到hashCode小实例,发现都拿到了hashCode,我很费解这是为什么呢?没有具体实现的方法能拿到返回值??郁闷一天后我突然发现了“native”这个关键字,查阅资料过后才发现我竟然不晓得“native”定义的方法。。。瞬间小小的鄙视了下自己,Java学的不够扎实呀!
这里有篇帖子讲Native Method的,普及型文章拿来个大家分享

http://www.iteye.com/topic/72543

好的回归重点,Object.hashCode()方法中明确说明了这个方法的具体实现是(“This is typically implemented by converting the internal address of the object into an integer”)将对象的地址使用int形式返回,但后面又强调这只是一个变成技巧Java不需要这样实现,这里指的是Java允许对象能自定义获得hashCode的算法。当然这是哈希冲突产生的原因,这里建议首先最好避免产生哈希冲突的算法,其次需要具备解决哈希冲突的办法。
我们在这可以认为新实例化的对象若没有重写hashCode方法则返回的hashCode为该对象地址的值,但强烈建议建议从写hashCode尤其是写JavaBean的时候。

--------------------------------------------------太晚了,先写到这!hashCode就先讲到这,下面是HashTable
分享到:
评论

相关推荐

    深入解读大厂java面试必考点之HashMap全套学习资料

    1. **哈希函数**:HashMap使用对象的`hashCode()`方法生成哈希码,这个哈希码用于确定元素在数组中的位置。一个好的哈希函数能够尽可能均匀地分布数据,减少冲突。 2. **数组与链表**:当哈希冲突发生时,HashMap...

    2017年Java面试题,Java开发

    - equals()和hashCode()用于定义对象的内容相等性和哈希码计算,通常在需要对象存储到集合中时重写。 - sleep()和wait()都能使线程暂停执行,但wait()需要在同步块或方法中调用,并且会释放对象锁。 - IO和NIO的...

    面试指南java

    - Equals()和HashCode()的作用:理解equals方法和hashCode方法在Java中的重要性,以及它们如何影响对象比较和集合操作。 - Sleep()和Wait()的区别:清楚这两个方法在多线程环境下的使用及其背后的原理。 - IO与NIO的...

    Java面试指南.pdf

    Java面试的准备可以分为几个部分,其中最重要的部分是Java技术相关,包括了Java的基础知识、核心API的解读以及Java中高级技术的理解。同时,面试者应该熟悉应聘流程,了解如何撰写简历,以及在面试中如何谈论福利...

    2015Java面试指南

    - **equals()和hashCode()作用**:`equals()`用于比较两个对象是否相等,而`hashCode()`返回对象的哈希码值,常用于散列表(如`HashMap`)中确定对象存储位置。两者通常需要配合使用,以确保对象在散列表中的一致性...

    JAVA面试指南

    **第04章 解读API** - **4.1 Object常用的方法:** - `toString()`:返回对象的字符串表示。 - `equals(Object obj)`:判断两个对象是否相等。 - `hashCode()`:返回对象的哈希码值。 - `clone()`:克隆当前...

    java面试宝典

    #### 第一章 解读API 1. **Object常用的方法**:包括wait(), notify(), finalize(), equals(), toString(), hashCode()等。 2. **String与StringBuffer的区别**:String是不可变对象,StringBuffer是可变对象。 3. *...

    javaSE代码实例

    1.2.3 安装后Java目录的解读 7 1.3 学会使用API 7 1.4 第一个Java程序 8 1.4.1 开发源代码 8 1.4.2 编译运行 9 1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 ...

    后端开发基础知识整理JAVA、JVM、操作系统、网络、设计模式、mysql、redis、多线程、spring、springboo

    以下是针对文档标题、描述以及部分内容中提到的重要知识点的详细解读。 #### 1. Java语言基础 - **JVM、JRE、JDK的关系**: - **JVM (Java Virtual Machine)**:是Java虚拟机,负责执行字节码。 - **JRE (Java ...

Global site tag (gtag.js) - Google Analytics