初学java,对hashcode()有些搞不明白。一直以为hashcode()是返回对象地址的,或者是某种和地址有关的东西的。以前看别人代码里通过打印两个对象的hashcode来证明他们是不同的地址。所以我一直拿它和equal()做比较,认为它和equal相反,因为equal恰恰是比较内容,而不管对象的实际内存情况。最近发现java文档中说,a.equal(b)==true则必定a.hashcode()==b.hashcode()。对此让我非常不解。我的问题如下:1。hashcode()到底是干什么用的?好像是和数据结构的hash表有关?java对象怎么会和hash表有关的?java中的对象都是存在一个hash表中吗?2。为什么a.equal(b)==true则必定a.hashcode()==b.hashcode()。equal代表内容,hashcode代表内存地址,难道我理解错了吗?3。很多类都重写了hashcode,比如Integer.hashcode返回的是Integer的intValue。他们为什么要重写呢?4。有人说a.equal(b)==true则必定a.hashcode()==b.hashcode();反之a.hashcode()==b.hashcode()则不一定a.equal(b)==true; 那奇怪了,hashcode岂不是毫无用处了?大家都用hashcode做什么呢?

解决方案 »

  1.   

    Object 对象中有方法 equals(Object obj)
    这个hashCode主要是针对这个方法
    因为:
    Equal objects must have equal hash codes
      

  2.   

    另外你可以根据需要重写这个方法.对于String的hashCode有些特别,你可以看看源代码(src.zip中)
      

  3.   

    呕,我看了Object.equal的代码,里面就是直接reture a==b; 所以他们的hashcode当然相等。那么其他那些重写了equal的类,是不是hashcode就不等了?
      

  4.   

    1。hashcode()到底是干什么用的?好像是和数据结构的hash表有关?java对象怎么会和hash表有关的?java中的对象都是存在一个hash表中吗?当你的对象存储在HashSet,HashMap,HsahTable等以hash表为工作机制的容器的时候 你才需要关心这个函数,不是java中对象都是存在一个hash表里面2。为什么a.equal(b)==true则必定a.hashcode()==b.hashcode()。equal代表内容,hashcode代表内存地址,难道我理解错了吗?
     
    谁说equals是比较内容的,默认的equals 就是与 == 一样的效果
    3。很多类都重写了hashcode,比如Integer.hashcode返回的是Integer的intValue。他们为什么要重写呢?就是因为Integer重写了equals() 方法 ,所以要重写hsahCode(),以保证a.equals(b) 为true时候,有a==b;重写只要为了满足可能把Integer对象放到hash容器里面4。有人说a.equal(b)==true则必定a.hashcode()==b.hashcode();反之a.hashcode()==b.hashcode()则不一定a.equal(b)==true; 那奇怪了,hashcode岂不是毫无用处了?大家都用hashcode做什么呢?用hsahCode()主要是支持hash容器的正确运行,hash容器根据hashCode决定对象的存储位置
    hash容器速度比较快