A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黎志文 于 2013-6-10 04:56 编辑

class Test
{
        public int hashCode()
       {
             return 60;
       }
  
}
class Demo
{
        public static void main(String[] args)
       {
              Test t1 = new Test();
              Test t2 = new Test();
              System.out.println("t1="+t1+"...t2="+t2);
              System.out.println(t1==t2);
        }
}
打印出来的结果是:
t1=Test@3c...t2=Test@3c
false
这是什么意思?我以为t1和t2的哈希码值相同,也就代表它们在内存中的地址值相同,所以它们是同一个对象,但t1==t2结果却是false,这样看来这俩对象在内存中的地址值是不一样的,那么
1.它们的地址值又是什么?
2.它们的地址值和它们的哈希码值有何关系?  
3.Object 类中的equals比较的是否就是两个对象的地址值?

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1

查看全部评分

8 个回复

倒序浏览
哈希值和内存地址 可能有一定的联系 但是没有必然的联系啊 这个涉及到计算机系统中的存储形式,如果是哈希存储形式  那么 这存储地址会根据哈希值 再有一些规则算出存储地址   如果哈希值相同 还会有解决哈希值冲突的机制   如果有兴趣的话  可以去对该知识点的研究一下   欢迎分享 研究成果!!

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
刘凯 发表于 2013-6-8 17:04
哈希值和内存地址 可能有一定的联系 但是没有必然的联系啊 这个涉及到计算机系统中的存储形式,如果是哈希 ...

嗯嗯,刘大版主说的很有道理,我刚刚去搜索了一下,对这几个问题有点点稍深入的了解了:
1.对象的哈希码值和内存地址值不是一回事;
2.如果自定义类不复写hashCode方法,那么该方法返回的哈希码值,应该就是对象的内存地址值,如果复写了hashCode方法,那么此时对象的哈希码值就不是它的内存地址值了;
3.如果自定义类不复写Object类中的equals方法,那么equals比较的就是两个对象的内存地址值。
对哈希码值和内存地址值有点明了了,谢谢刘大版主!回复可真神速,哈哈...
回复 使用道具 举报
看Object类中的hashcode的源码 public native int hashCode(); 知道这是一本地方法,也就是说当new一个对象的时候,都会有一个hash码,计算hash码用到相应的hash算法,我个人认为之所以hashcode()方法是一个本地方法,是应为java中的对象的hash码的得出是通过本地系统提供的hash算法(个人理解,有误请指正),还有java中 对象的hashcode并不是指对象的物理地址。你复写hashcode方法后,就是说对象的hashcode是按你写的方法来计算而已,在楼主的程序中你是new了两个对象,所以内存地址肯定是不一样的,但是在你定义的类中复写里hashcode方法,而且是返回一个确定的值,所以他们hash码肯定是一致的。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
java.exe 发表于 2013-6-8 17:34
看Object类中的hashcode的源码 public native int hashCode(); 知道这是一本地方法,也就是说当new一个对象 ...

嗯,应该是这样子,谢谢!
回复 使用道具 举报
黎志文 发表于 2013-6-8 17:21
嗯嗯,刘大版主说的很有道理,我刚刚去搜索了一下,对这几个问题有点点稍深入的了解了:
1.对象的哈希码 ...

我认为即使不复写hashcode方法 返回的也不是内存地址 因为人们研究hash算法就是想尽量的避免冲突,提高算法性能,如果单单用内存地址来当做hash码的话也就没有什么算法可言,而且内存中不同对象的地址肯定不同,那么如果用内存地址代表hashcode,在往hash表中存储的时候也就没有什么冲突可言,而实际上冲突时存在的,这也就是为什么java中在hashcode一样时并不能确定两个对象就是同一个对象,还要调用equals方法(在没复写equals方法时,它比较的是内存地址)再次进行比较的原因。
回复 使用道具 举报
a464538715 来自手机 中级黑马 2013-6-8 18:09:35
7#
哈希值是通过地址值生成的 地址值是16进制  而==则比较的是地址值 这是我的个人理解http://bbs.itheima.com/thread-41698-1-1.html 这里有解答可以参考
回复 使用道具 举报
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。{:soso_e102:}
回复 使用道具 举报
学习了。:lol:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马