HashTable中解读hashCode

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

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

[/quote]

从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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值