黑马程序员技术交流社区

标题: 关于==和hashCode 欢迎补充 [打印本页]

作者: a464538715    时间: 2013-6-3 21:23
标题: 关于==和hashCode 欢迎补充
本帖最后由 a464538715 于 2013-6-4 01:31 编辑

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


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

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

恩 好的
作者: a464538715    时间: 2013-6-4 01:23
刘胜寒 发表于 2013-6-4 01:17
问题可以结贴了楼主。。

没给我技术分的 == 是比较的内存地址值 而hashCode是通过地址值算出来的 是为了判断是否存在两个地址一样的对象 比如Set集合添加元素的时候 “==”调用的是底层办法 而不是hashCode方法
作者: a464538715    时间: 2013-6-4 01:29
刘胜寒 发表于 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");
                }
作者: a464538715    时间: 2013-6-4 01:34
a464538715 发表于 2013-6-4 01:29
调用hashCode@后面的应该就是地址值   所以你说hashCode是计算对象的内存地址是不对的 而且很多hashCode ...

i<=j && j<=i 这里有< >号 所以比较的是值的大小
i!=j 后面就是比较引用的地址值
只有同一个new 创建的对象才会是true 其实这个蛮细节的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2