1. 程式人生 > >Java Map釋放內存置null以及調用clear()的區別

Java Map釋放內存置null以及調用clear()的區別

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()返回的值:

  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()的區別