2012-03-07 316 views
2

代碼:方法map = null和map.clear()是否相同?

public class MyClass { 
private Map<Integer,String> myMap=new HashMap<Integer, String>(); 
........................... 


void methodFillMap(){ 
    myMap.put(.....); 

..................... 
} 

} 

什麼是正確的:

void methodFillMap(){ 
myMap.clear(); 
myMap.put(.....); 

..................... 
} 

void methodFillMap(){ 
myMap=null; 
myMap.put(.....); 

..................... 

} 或更好

void methodFillMap(){ 
    myMap=new HashMap<Integer, String>(); 
    myMap.put(.....); 

    ..................... 
} 

回答

3

最後一個是最好的之一,如果你不是非常有限memmory編碼系統則是第一個最

  1. 在您需要清除hashtabel第一種情況下whitch需要一些計算。
  2. 因爲你剛剛得到一個空引用而不是散列表,所以secound將不起作用。
  3. 在第三種情況下,您只需扔掉舊的hashmap並讓垃圾回收器處理舊的垃圾回收器。
+1

1和3之間有一個主要區別..如果其他任何東西都有對地圖的活動引用(通過反射或引用地圖的另一個局部變量),那麼只要存在其他引用,則您的項目將保留在內存中;比這更糟糕的是,你有兩個具有獨立實體的地圖。一般情況下應該使用'map.Clear()',除非運行明確無誤的時間會減慢應用程序的運行速度。 – Seph 2012-03-07 09:25:42

7

無效methodFillM ap(){ myMap = null; myMap.put(.....);

只會拋出一個NullPointerException。

要清除地圖,您應該使用myMap.clear()。

順便說有重新實例地圖,並使用明確的兩點區別:

剔透不會調整地圖。如果HashMap包含n個桶,清除之後仍會包含n個空桶,並帶有性能後果(正面或負面取決於您對地圖的使用情況)

如果您使用清除,則不會丟棄對象,因此不會通過下一個GC進行管理,如果這種情況發生很多,則會對GC時間產生影響(正向)。

8

NO。他們不一樣。

  • map = null將null指定給Map引用。
  • map.clear()清除地圖的內容,但該對象仍然存在,並且map仍然引用它。
2

在將地圖設置爲空之後,將其中的任何東西放在裏面都會導致NullPointerException

2

這不一樣,因爲map = nul不會使地圖條目變爲無效。 map = null只會使對地圖的引用無效。 從下面JDK 7見明確的實施:

public void clear() { 
     modCount++; 
     Entry[] tab = table; 
     for (int i = 0; i < tab.length; i++) 
      tab[i] = null; 
     size = 0; 
    } 

我會用map.clear()。

相關問題