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

今天本身在總結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()返回的值:指針

 

  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()返回code

的值,發現仍然是0。htm

 

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

若是直接將map對象置null,這個時候再次輸出hashCode()則不會有輸出結果,而是報空指針異常了。對象

到這裏,就很明白了,雖然將map對象的數據都clear()了,key和value爲null,可是內存中map對象還存在,而且mapblog

具備強引用,雖然key和value爲空,可是JVM的垃圾回收器並不會回收該對象的內存,若是再程序中建立不少這樣子的沒內存

有釋放的對象就會形成內存泄漏,因此小夥伴們再建立map對象的時候,若是再也不用到該對象的時候,要注意及時釋放該對象

的內存空間。有什麼寫的很差的歡迎你們指出,我及時修改好不誤人子弟。

相關文章
相關標籤/搜索