hashmap的key为一个对象,当key=null的时候,为什么不能被GC回收?

HashMap<Integer,String> map = new HashMap<>();

Integer key = new Integer(1);

String value = "hashmap";

map.put(key,value);

System.out.println(map); //{1=hashmap}

key = null;

System.gc();

System.out.println(map); //{1=hashmap}
阅读 6k
3 个回答

你把key这个引用赋值为null, 并不意味着Hashmap里的key也是null.

你要区分变量引用和内存对象的关系。

new Integer(1); 生成一个对象, 假设内存地址是 0x87654321, jvm把这个内存地址给了key,
map.put(key,value); 时, map里增加了个键值对,键是0x87654321,值是"hashmap"。注意:键不是kye变量本身!
key=null, 是把key这个变量指向空, 但map里的键值对不受影响。

你想象成map里面的一个键和key都指向同一块内存,key赋值为null之后,map中的那个键还是指向这块内存。所以key和map压根没啥关系

简单解释一下:
所谓对象,可以分为引用和数据两部分,引用和数据之间就像是遥控和电视机;
无论电视机里面节目怎么切换,遥控还是一样的操作控制,即数据变化不影响引用关系;
但是,假如你换台电视机,或者换个遥控,那就跟原先情况完全不同了,这种情况属于,引用替换或者数据替换,是全新的对应关系。
Map中key的作用相当于引用,value相当于数据
你替换了key整体,它无法反映到Map中去,所以跟原先就不是一回事了
就好像一个人只要灵魂还在,无论变成什么样,他还是他,但要是灵魂也丢了,那就与本来的他失去了联系

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题