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

Posted 牧童的思恋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Map释放内存置null以及调用clear()的区别相关的知识,希望对你有一定的参考价值。

今天自己在总结map的时候,想到了在释放Map对象空间的时候就有使用过将Map对象置null,也有时候会调用clear()将Map中的数据清除,那么它们都有什么区别呢?

 

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

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

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

 

System.out.println("map.hashCode:"+map.hashCode());
输出结果如下:
技术分享图片

技术分享图片

再看看hashCode()的源码:

技术分享图片

技术分享图片

技术分享图片

技术分享图片

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

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

 

  1.  
    map.put(1,"霍去病");
  2.  
    map.put(2,"李广");
  3.  
    map.put(3,"刘彻");
  4.  
    map.put(4,"马邑");
  5.  
    map.put(5,"桑弘基");
  6.  
    map.put(6,"苏武");
  7.  
    System.out.println("新map.hashCode:"+map.hashCode());
技术分享图片

技术分享图片

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

的值,发现仍然是0。

 

  1.  
    map.clear();
  2.  
    System.out.println("after clear:"+map.hashCode());
技术分享图片

技术分享图片

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

技术分享图片

技术分享图片

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

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

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

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


以上是关于Java Map释放内存置null以及调用clear()的区别的主要内容,如果未能解决你的问题,请参考以下文章

free()的释放是何涵义,是把内容清空还是把指针置为NULL啊,还是其他啥啊。。求指点啊。。

关于java内存释放的问题

为啥调用 std:map:clear 后内存占用率没有降低

c++ map clear相关内存会清空吗?

c++ map clear相关内存会清空吗

[C]安全释放堆内存