2012-06-12 58 views
10

比方說,我得到了一個Map<String, String>,我想刪除所有包含foo的值。在優化/內存/等方面做什麼是最好的方式?下面的四個syso正在打印相同的結果,也就是說{n2=bar}傳遞一個對象作爲參數並在方法內修改它

public static void main(String[] args) { 

    Map<String, String> in = new HashMap<String, String>(); 
    in.put("n1", "foo"); 
    in.put("n2", "bar"); 
    in.put("n3", "foobar"); 

    // 1- create a new object with the returned Map 
    Map<String, String> in1 = new HashMap<String, String>(in); 
    Map<String, String> out1 = methodThatReturns(in1); 
    System.out.println(out1); 

    // 2- overwrite the initial Map with the returned one 
    Map<String, String> in2 = new HashMap<String, String>(in); 
    in2 = methodThatReturns(in2); 
    System.out.println(in2); 

    // 3- use the clear/putAll methods 
    Map<String, String> in3 = new HashMap<String, String>(in); 
    methodThatClearsAndReadds(in3); 
    System.out.println(in3); 

    // 4- use an iterator to remove elements 
    Map<String, String> in4 = new HashMap<String, String>(in); 
    methodThatRemoves(in4); 
    System.out.println(in4); 

} 

public static Map<String, String> methodThatReturns(Map<String, String> in) { 
    Map<String, String> out = new HashMap<String, String>(); 
    for(Entry<String, String> entry : in.entrySet()) { 
     if(!entry.getValue().contains("foo")) { 
      out.put(entry.getKey(), entry.getValue()); 
     } 
    } 
    return out; 
} 

public static void methodThatClearsAndReadds(Map<String, String> in) { 
    Map<String, String> out = new HashMap<String, String>(); 
    for(Entry<String, String> entry : in.entrySet()) { 
     if(!entry.getValue().contains("foo")) { 
      out.put(entry.getKey(), entry.getValue()); 
     } 
    } 
    in.clear(); 
    in.putAll(out); 
} 

public static void methodThatRemoves(Map<String, String> in) { 
    for(Iterator<Entry<String, String>> it = in.entrySet().iterator(); it.hasNext();) { 
     if(it.next().getValue().contains("foo")) { 
      it.remove(); 
     } 
    } 
} 

回答

4

最好的辦法是methodThatRemoves因爲:

  1. 在內存消耗方面:它不創建一個新的地圖,這樣不會增加內存開銷。
  2. 根據CPU的使用情況:迭代器具有O(1)複雜度,用於調用next或刪除當前元素。
0

我會親自去與methodThatRemoves,因爲你只是進行循環操作和檢查「foo」的平等。其他人也這樣做,以及對象圖創建和地圖清除/放置操作。所以你顯然有一種方法做得更少。

此外,如果您想減少內存使用情況,最好不要創建額外的HashMap來刪除1個或多個條目。這是假設你不介意迭代地圖的額外計算。

如果你真的想更深入,你應該使用探查器或某種類型來評估。

1

對我來說最好的是一個與Iterator - methodThatRemoves,因爲你沒有創建中間地圖和不使用put方法。

順便說第一個:methodThatReturns可以更快,因爲put複雜度爲O(1),而除去在最壞的情況下爲O(n),而是因爲你有地圖的2種不同的情況下,它會使用更多的內存。

2

最有效的方法methodThatRemoves,因爲它

  • 用途幾乎沒有記憶
  • 創建除(輕量級)迭代器沒有對象
  • 速度非常快(不使用任何地圖查詢)

雖然我不會先製作副本,除非您有不可修改的地圖或您需要保留原始地圖。

+0

是不是那個刪除方法是什麼? – tibtof

+0

是這是什麼不同,除了等於,這不是他想要的 – jonasr

+0

哎呀!我撇開了這個問題:/我會刪除代碼:) – Bohemian

相關問題