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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张榆 中级黑马   /  2012-9-8 00:47  /  2992 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java中,对象的哈希值和地址值一样么?如果一样,在hashSet这种集合中,首先判断哈希值是否相同,哈希值相同再通过equals方法判断是否为同一对象,而Object中的equals方法就是判断对象的地址值,那也就应该相同的地址值,所以这样也不能加入重复元素啊,根本就不用覆写equals方法了。。。。

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 谷粒谷粒!加油

查看全部评分

6 个回复

倒序浏览
本帖最后由 冯心程 于 2012-9-8 01:30 编辑

哈希值是哈希值 是哈希算法算出来的跟你说的地址值不一样
HashSet 存储的时候利用了HashCode方法 算出其对应的哈希值 根据哈希值进行储存 如果哈希值相同则不存。。如果是一个对象。。哈希值如果相等则还要进行进一步判断利用equals方法 如果相同则不存储具体应用中equals这个不是比的地址 而是复写它比较那些哈希值被判断相等的元素 进行次要条件的判断 比如person("张三丰",20) person("张四丰",20)  张三丰和张四丰的年龄哈希值相等 主要条件相等就要再用equals判断定义的次要条件name 不相等则存入 相等则不存



补充:::::::
妹子自己亲自写个传入对象并比较元素的代码就知道了
实际应用中往集合里传入对象是这样的
// 往ArrayList集合中存储自定义对象。Person.
ArrayList list = new ArrayList();
  
  list.add(new Person("张一丰", 50));
  list.add(new Person("张二丰", 60));
  list.add(new Person("张三丰", 90));
  list.add(new Person("张三丰", 90));

//集合中最终存储都是对象的引用。
传入的都是Person 但是每个地址都不相等 如果不复写equals 。怎么比较都不会相等     而其中张三丰90岁的相同元素就有重复  

回复 使用道具 举报
冯心程 发表于 2012-9-8 01:18
哈希值是哈希值 是哈希算法算出来的跟你说的地址值不一样
HashSet 存储的时候利用了HashCode方法 算出其对 ...

你误解了我的意思 ,我是说还没覆写equals方法的时候,判断的不就是地址值么,而不是元素内容?
回复 使用道具 举报
张榆 发表于 2012-9-8 01:20
你误解了我的意思 ,我是说还没覆写equals方法的时候,判断的不就是地址值么,而不是元素内容? ...

看我上面回答的 给你补充了:loveliness:
回复 使用道具 举报
冯心程 发表于 2012-9-8 01:30
看我上面回答的 给你补充了

你就直接告诉我哈希值和地址值是不是一样的吧
回复 使用道具 举报
张榆 发表于 2012-9-8 01:40
你就直接告诉我哈希值和地址值是不是一样的吧

。。。。才发现原来是一班的:L 是你啊、、、 不一样  地址值应该是内存分配的
回复 使用道具 举报
没有覆盖前的Object对象中equals方法比较的的确是内存地址值,假如说向hashSet集合中添加1000个元素,那么第1001个元素要添加的时候就要依次的和集合里面的1000个元素去equals比较,会大大降低效率,hash是一个人的名字,是他提出的哈希算法概念,也叫散列算法,具体算法是什么样的,我也不知道,java就是将数据通过哈希算法直接指定到一个内存地址上去,hashcode方法返回的并不是对象的物理存储地址,这样,向集合里添加元素时,调用hashCode方法直接就能定位到它应该放置的物理位置,如果这个位置上没有元素,就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址,这样就不用调用那么多次的equals方法了
java中规定:用equals方法比较两个对象是相同的,那么它们的hashcode方法返回的值也必须相同,两个对象的hashCode相同,它们并不一定相同
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马