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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© a464538715 中级黑马   /  2013-6-3 21:23  /  1759 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 a464538715 于 2013-6-4 01:31 编辑

其实我以前错误的认为== 就是 调用hashCode方法比较 其实不是的 ==就是比较堆内存中地址值
而hashCode只是通过地址生成的一个东西 但是又不能当成地址对待
在Set集合添加元素时会调用hashCode方法来确认是不是同一个元素
其实java为什么不用对内存地址值呢?哎

12 个回复

倒序浏览
个人理解:
hashcode 其实是给内存地址分区段,以达到快速查询的目的
比如,如果你要到中国(对应内存)去找个人,那你是不是要把整个中国都找一遍?
但是,如果你已经知道这个人在北京(hashcode)那你是不是就只需要找北京内的就可以了?
这样可以大幅度的提升查询速度。
回复 使用道具 举报
First 发表于 2013-6-3 22:22
个人理解:
hashcode 其实是给内存地址分区段,以达到快速查询的目的
比如,如果你要到中国(对应内存)去 ...

这个说法是对的
回复 使用道具 举报
刚看到Vector  快要接触Set了, 长长见识 {:soso_e182:}
回复 使用道具 举报
== 是指向同一个对象。。。也就是指向同一个内存地址。。。。。hashCode是计算这个对象的内存地址。有些时候某些类是可以复写hashCode的。。
回复 使用道具 举报
有些时候hashCode相等,==判断的时候不一定相等。比如String 就是一个例子。
回复 使用道具 举报
问题可以结贴了楼主。。
回复 使用道具 举报
刘胜寒 发表于 2013-6-4 01:17
问题可以结贴了楼主。。

恩 好的
回复 使用道具 举报
刘胜寒 发表于 2013-6-4 01:17
问题可以结贴了楼主。。

没给我技术分的 == 是比较的内存地址值 而hashCode是通过地址值算出来的 是为了判断是否存在两个地址一样的对象 比如Set集合添加元素的时候 “==”调用的是底层办法 而不是hashCode方法
回复 使用道具 举报
刘胜寒 发表于 2013-6-4 01:15
== 是指向同一个对象。。。也就是指向同一个内存地址。。。。。hashCode是计算这个对象的内存地址。有些时 ...

调用hashCode@后面的应该就是地址值   所以你说hashCode是计算对象的内存地址是不对的 而且很多hashCode方法都被重写了  只有当是用同一个new建立的对象 才会 == ,当时== 返回true的情况是引用类型不是基本类型 下面这段代码就是死循环
Integer i=new Integer(0);  //定义i,j为引用类型
                Integer j=new Integer(0);
                while( i<=j && j<=i && i!=j )
                {
                        System.out.println("YES");
                }

点评

必须是个死循环啊 。。。i和j不相等。。是true  发表于 2013-6-4 01:32

评分

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

查看全部评分

回复 使用道具 举报
a464538715 发表于 2013-6-4 01:29
调用hashCode@后面的应该就是地址值   所以你说hashCode是计算对象的内存地址是不对的 而且很多hashCode ...

i<=j && j<=i 这里有< >号 所以比较的是值的大小
i!=j 后面就是比较引用的地址值
只有同一个new 创建的对象才会是true 其实这个蛮细节的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马