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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 殷婷婷 中级黑马   /  2013-11-3 22:09  /  1844 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 殷婷婷 于 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:})

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
  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-3 22:21
虽然hashcode()是一样的,但是他在调用hashcode的时候,还会调用一次系统的equals方法进行一次比较,如果eq ...

这谁都知道啊,根本不是在回答我的问题啊,我的问题是两个或多个对象怎么能共用一个哈希值呢?它们究竟是怎么存储的?
回复 使用道具 举报
本帖最后由 瓶中人 于 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();
        }
如上代码如果名字、年龄、体重和颜色都一样,哈希值也一样。所以不能说共用一个哈希值,是哈希值相同。至于怎么存储我就不知道了

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

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

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

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

无标题.png

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 神马都是浮云

查看全部评分

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

个人感觉,不一定准确,共同讨论
回复 使用道具 举报
天下 中级黑马 2013-11-5 09:20:27
7#
女汉子,我给你解释解释:
1、对象存在于堆内存中,每个对象都有自己唯一的地址值,你这里new 了两个对象,两片内存空间,所以在内存中的位置肯定      是不一样的
  1. System.out.println(lld==(lldd));//打印结果:false
复制代码
  1. System.out.println(lld.equals(lldd));//打印结果:false
复制代码
至于哈希值相同,在不同的堆内存空间中,有相同的哈希值没有关系。
再说,开发中,也不会这么写程序吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马