黑马程序员技术交流社区

标题: 关于hashCode()的问题 [打印本页]

作者: 殷婷婷    时间: 2013-11-3 22:09
标题: 关于hashCode()的问题
本帖最后由 殷婷婷 于 2013-11-4 10:44 编辑
  1. import java.util.*;
  2. class LinkedListDemo
  3. {
  4.         public int hashCode()
  5.         {
  6.                 return 99;
  7.         }
  8.         public static void main(String[] args)
  9.         {
  10.                 LinkedListDemo lld = new LinkedListDemo();//哈希值是99
  11.                 LinkedListDemo lldd = new LinkedListDemo();//哈希值是99
  12.                 System.out.println(lld);
  13.                 System.out.println(lldd);
  14.         }
  15. }
复制代码
不明白,两个或多个对象怎么能共用一个哈希值呢?它们究竟是怎么存储的?(怎么没人回答啊{:soso_e136:}{:soso_e109:})
作者: 王东    时间: 2013-11-3 22:21
  1. import java.util.*;
  2. class LinkedListDemo
  3. {
  4.         public int hashCode()
  5.         {
  6.                 return 99;
  7.         }
  8.         public static void main(String[] args)
  9.         {
  10.                 LinkedListDemo lld = new LinkedListDemo();//哈希值是99
  11.                 LinkedListDemo lldd = new LinkedListDemo();//哈希值是99
  12.                 System.out.println(lld);
  13.                 System.out.println(lldd);
  14.         }
  15. }
复制代码
虽然hashcode()是一样的,但是他在调用hashcode的时候,还会调用一次系统的equals方法进行一次比较,如果equals方法返回true,那么两个对象才会被虚拟机认为一样的。
所以,在重写hashcode的同时,也要重写equals方法。
作者: 殷婷婷    时间: 2013-11-4 10:40
王东 发表于 2013-11-3 22:21
虽然hashcode()是一样的,但是他在调用hashcode的时候,还会调用一次系统的equals方法进行一次比较,如果eq ...

这谁都知道啊,根本不是在回答我的问题啊,我的问题是两个或多个对象怎么能共用一个哈希值呢?它们究竟是怎么存储的?
作者: 瓶中人    时间: 2013-11-4 14:04
本帖最后由 瓶中人 于 2013-11-4 14:06 编辑

hashcode是用对象的内部地址转换成一个整数的.其默认从Object继承来的hashCode是基于对象的ID实现的 ,所以就像对象是一样的,哈希值也不相同,所以要重写hashCode();public int hashCode(){
             return 7 * name.hashCode() + 11* new Integer(age).hashCode() + 13 * new Double(weight).hashCode() + 17 * color.hashCode();
        }
如上代码如果名字、年龄、体重和颜色都一样,哈希值也一样。所以不能说共用一个哈希值,是哈希值相同。至于怎么存储我就不知道了


作者: 王东    时间: 2013-11-4 18:36
殷婷婷 发表于 2013-11-4 10:40
这谁都知道啊,根本不是在回答我的问题啊,我的问题是两个或多个对象怎么能共用一个哈希值呢?它们究竟是 ...

毕老师在讲hashcode的那部视频里有讲到这个具体是怎么分配的,你可以找来那个视频看一看

无标题.png (33.19 KB, 下载次数: 16)

无标题.png

作者: kangxiaoning    时间: 2013-11-4 23:38
Java对象都从Object类继承了一个默认的hashCode()方法。这个方法将对象在内存中的地址作为整数返回,这是一个很好的hash实现,他确保了不同的对象拥有不同的hashcode。所以,你将hash值指定了相当于99这个内存空间就是存的第一个对象,创建第二个对象的时候发现是hash值与第一个相同,是不是就直接指向第一个的那里了, 两个实际是一个。

个人感觉,不一定准确,共同讨论
作者: 天下    时间: 2013-11-5 09:20
女汉子,我给你解释解释:
1、对象存在于堆内存中,每个对象都有自己唯一的地址值,你这里new 了两个对象,两片内存空间,所以在内存中的位置肯定      是不一样的
  1. System.out.println(lld==(lldd));//打印结果:false
复制代码
  1. System.out.println(lld.equals(lldd));//打印结果:false
复制代码
至于哈希值相同,在不同的堆内存空间中,有相同的哈希值没有关系。
再说,开发中,也不会这么写程序吧




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