java dispose null_Java Map释放内存置null以及调用clear()的区别

Map map = new HashMap<>();

首先,在创建一个map对象时,map指向堆中新创建的对象,这时候的map是一个没有key和value的空对象。众所周知,

map.hashCode()某种意义上相当返回了对象的地址。所以在用刚创建的map对象调用hashCode()方法:

System.out.println("map.hashCode:"+map.hashCode());

输出结果如下:

L3Byb3h5L2h0dHBzL2Jsb2cuY3Nkbi5uZXQvcXFfMjUzMDI0NTEvYXJ0aWNsZS9kZXRhaWxzLzc4NDc3OTEy.jpg

1f06d16e90fa629b73d7b3c17213608a.png

再看看hashCode()的源码:

68a7abda73235eb90838bbea40f8d094.png

e313a027434b5eabf4f02e9214b97dca.png

L3Byb3h5L2h0dHBzL2Jsb2cuY3Nkbi5uZXQvcXFfMjUzMDI0NTEvYXJ0aWNsZS9kZXRhaWxzLzc4NDc3OTEy.jpg

L3Byb3h5L2h0dHBzL2Jsb2cuY3Nkbi5uZXQvcXFfMjUzMDI0NTEvYXJ0aWNsZS9kZXRhaWxzLzc4NDc3OTEy.jpg

通过源码可以发现,hashCode()方法通过获取key和value返回的哈希值进行异或运算后返回结果值,如果key和value值为空则返

回0。此时我们给map对象put值进去,然后再输出一个hashCode()返回的值:

map.put(1,"霍去病");

map.put(2,"李广");

map.put(3,"刘彻");

map.put(4,"马邑");

map.put(5,"桑弘基");

map.put(6,"苏武");

System.out.println("新map.hashCode:"+map.hashCode());

L3Byb3h5L2h0dHBzL2Jsb2cuY3Nkbi5uZXQvcXFfMjUzMDI0NTEvYXJ0aWNsZS9kZXRhaWxzLzc4NDc3OTEy.jpg

c2ef89f009655346d9d231d1cab86e56.png

返回了一串数字,此时说明map中是有数据的,这个时候我们再使用clear()方法将map中的数据清空后再次输出hashCode()返回

的值,发现仍然是0。

map.clear();

System.out.println("after clear:"+map.hashCode());

L3Byb3h5L2h0dHBzL2Jsb2cuY3Nkbi5uZXQvcXFfMjUzMDI0NTEvYXJ0aWNsZS9kZXRhaWxzLzc4NDc3OTEy.jpg

3da91a2f64700d189208d01fd2494ecd.png

如果直接将map对象置null,这个时候再次输出hashCode()则不会有输出结果,而是报空指针异常了。

ebb99ea819cf51cae659a735b68b8787.png

L3Byb3h5L2h0dHBzL2Jsb2cuY3Nkbi5uZXQvcXFfMjUzMDI0NTEvYXJ0aWNsZS9kZXRhaWxzLzc4NDc3OTEy.jpg

到这里,就很明白了,虽然将map对象的数据都clear()了,key和value为null,但是内存中map对象还存在,并且map

具有强引用,虽然key和value为空,但是JVM的垃圾回收器并不会回收该对象的内存,如果再程序中创建很多这样子的没

有释放的对象就会造成内存泄漏,所以小伙伴们再创建map对象的时候,如果不再用到该对象的时候,要注意及时释放该对象

的内存空间。有什么写的不好的欢迎大家指出,我及时修改好不误人子弟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值