今天本身在总结map的时候,想到了在释放Map对象空间的时候就有使用过将Map对象置null,也有时候会调用clear()将Map中的数据清除,那么它们都有什么区别呢?
Map<Integer, String> map = new HashMap<>();
首先,在建立一个map对象时,map指向堆中新建立的对象,这时候的map是一个没有key和value的空对象。众所周知,html
map.hashCode()某种意义上至关返回了对象的地址。因此在用刚建立的map对象调用hashCode()方法:java
System.out.println("map.hashCode:"+map.hashCode());
输出结果以下:

再看看hashCode()的源码:spa
经过源码能够发现,hashCode()方法经过获取key和value返回的哈希值进行异或运算后返回结果值,若是key和value值为空则返3d
回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());

返回了一串数字,此时说明map中是有数据的,这个时候咱们再使用clear()方法将map中的数据清空后再次输出hashCode()返回code
的值,发现仍然是0。htm
-
map.clear();
-
System.out.println( "after clear:"+map.hashCode());

若是直接将map对象置null,这个时候再次输出hashCode()则不会有输出结果,而是报空指针异常了。对象
到这里,就很明白了,虽然将map对象的数据都clear()了,key和value为null,可是内存中map对象还存在,而且mapblog
具备强引用,虽然key和value为空,可是JVM的垃圾回收器并不会回收该对象的内存,若是再程序中建立不少这样子的没内存
有释放的对象就会形成内存泄漏,因此小伙伴们再建立map对象的时候,若是再也不用到该对象的时候,要注意及时释放该对象
的内存空间。有什么写的很差的欢迎你们指出,我及时修改好不误人子弟。