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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄玉昆 黑马帝   /  2013-2-24 12:31  /  2024 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄玉昆 于 2013-2-24 13:24 编辑

毕老师在说关于HashSet的删除问题的时候,说到新对象会先和集合中的对象比较,然后再移除,我想知道的是,集合中如果有这个对象,会被移除,那么这个新对象会不会也不存在呢?或者说在堆内存中是如何操作的呢?
  1. hs.add(new Person("a2",12));
  2.                 hs.add(new Person("a3",13));//原

  3.                 hs.remove(new Person("a3",13));//新
复制代码
下面是我自己画的一个图:
步骤如下:
①在堆内存中创建("a3",13)这个对象,开辟空间
②分配地址值,计算哈希值0x37ab
③将这个新的a3对象与原有的a3对象的哈希值比较,相同,再用equals比较是否相同,相同。
④将集合中的哈希值0x37ab删除。
⑤这一步还有吗?会将a3这两个对象都删除吗?我知道这两个对象没用后会在某一时刻被回收,但是在remove方法执行中或执行后会有相应的删除这两个对象的操作码?

HashSet的remove.PNG (9.88 KB, 下载次数: 31)

HashSet的remove.PNG

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
     玉昆,其实这两个对象你是要分开看就好理解了,你干嘛要把它们放到一起呢。你使用 hs.remove(new Person("a3",13)。JVM会先根据你新生成的对象的hashCode值去查找对应的内存上的元素对象,如果用equals方法比较相同,则将其删除。至于你新生成的对象,则另外看待,我相信你很清楚,这个用于比较的对象时没有引用对象指向它的,它会在适当的时候被JVM的gc回收。
回复 使用道具 举报
陈科宇 发表于 2013-2-24 12:38
玉昆,其实这两个对象你是要分开看就好理解了,你干嘛要把它们放到一起呢。你使用 hs.remove(new Pers ...

嗯啊,其实,我似乎是明白的,remove并没有进行第五步的操作,第五步的操作是交给JVM的垃圾回收机制完成的。但是,我只是不很肯定而已,就来问问大家的看法,当然,高手解答就更清晰了,嘿嘿
回复 使用道具 举报
补充一点:集中的存储的是对象的引用(对象在内存中的地址),如果两Person对象相同,会把原对象的引用(地址)从集合中移除,执行完这个动作后,跟楼上所说的差不多吧
回复 使用道具 举报
本帖最后由 朱玉玺 于 2013-2-24 13:35 编辑

③获取这个新的a3对象的哈希值,拿着这个哈希值遍历集合的所有元素,如果碰到有集合相同的哈希值,就不往下遍历了,同时再比较equals方法,只有在equals也相等的情况下,就表示找到这个元素,将之删除。remove应该移除的是引用的指向,对整个对象的在堆内存中的删除动作,应该是gc完成的。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马