Java Map釋放內存置null以及調用clear()的區別
阿新 • • 發佈:2018-12-12
header mod net lang number 指針 垃圾回收 htm sdn
今天自己在總結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()返回的值:
- 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()返回
的值,發現仍然是0。
- map.clear();
- 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()的區別