2012-02-01 79 views
0

我有一個List<Pair<String, String>>我想從Collection複製數據。獲取集合元素的最快方法是什麼?

什麼是讀取收藏並將其添加到列表的最佳方式?

List<Pair<String, String>> identityMemoPairs = new LinkedList<Pair<String, String>>(); 
Collection result = handler.getResult(); 

    while(result.iterator().hasNext()){ 
     IdentityM im =(IdentityM) result.iterator().next(); 
     identityMemoPairs.add(Pair.of(im.identity,im.memo)); 
    } 
+0

嗯,我會說最好的方法是......讀取集合並將轉換後的值添加到列表中。沒有更多。 :) - 嚴重的是,這有什麼問題? – Thomas 2012-02-01 15:47:00

+0

檢查http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist以瞭解List實現的性能。迭代時,沒有區別。 – jalopaba 2012-02-01 15:54:11

+0

獲取元素需要很長時間。 – michdraft 2012-02-01 15:57:28

回答

3

你的代碼是錯誤的,因爲你在while循環的每次迭代中創建一個新的迭代器(實際上你創建了它們中的兩個)。每個新的迭代器都將指向result集合的開始處。因此你創建了一個無限循環。

要解決此問題,請僅調用result.iterator()一次並將結果存儲在變量中。

但甚至更好(更好的閱讀,更不容易出錯)將是for-each循環,它是(幾乎總是)的優選的變體來遍歷集合:

for (IdentityM im : (Collection<IdentityM>)result) { 
    identityMemoPairs.add(Pair.of(im.identity,im.memo)); 
} 

編譯器自動將使用迭代器將其轉換爲代碼,因此沒有性能差異。一般來說,只要您避免一些不好的事情,例如在LinkedList上調用get(i),則迭代集合時性能無關緊要。

請注意,編譯器會在這裏給出警告,這與迭代無關,但使用原始類型Collection(而不是Collection<IdentityM>)。如果可能,請檢查handler.getResult()實際上是否返回Collection<IdentityM>並將result變量的類型更改爲此。

另一個問題是,你是否真的需要該列表作爲成對列表。通常不建議使用簡單對類,因爲它們的名稱不顯示它們所代表的對象的含義。例如,最好使用類PersonName,該類具有名字和姓氏的字段而不是Pair<String, String>。爲什麼你不能只使用List<IdentityM>?如果你可以使用這個,你確定你不能使用Collection<IdentityM>? (ListCollection通常是可以交換的。)然後你可以完全避免複製。

0

您的代碼非常好,因爲它是。但你可能會讓handler直接返回對的集合,所以你可以調用identityMemoPairs.addAll()而不是自己迭代集合。但這隻會使它「更漂亮」,它不會帶來更多的性能。

相關問題