2016-05-31 60 views
0

如果我有這樣的:Android的列表(ArrayList中,列表等)中的addAll()與重新定義的參考

ArrayList<Data> mList = new ArrayList(); 

... 

public void setList(ArrayList<Data> list) { 
    mList = list; 
} 


public void updateList(ArrayList<Data> list) { 
    mList.clear(); 
    mList.addAll(list); 
} 

哪個更有效,setList()updateList(),爲什麼?最佳做法是什麼?

編輯:

不要與this問題相混淆。

+1

這是用於RecyclerView嗎?如果是,updateList更適合。 –

+0

如果「有效」是指「更快」,那麼'setList'更快,因爲'updateList'是O(N) – khelwood

+0

還有第三個選項可以避免'清除'而不泄漏你的列表:'mList = new ArrayList <>(list);' – shmosel

回答

9

這兩者之間存在巨大的概念差異。

您的setList()需要參考列表;並改變你的mList ...指向那個參考。

雖然您的updateList()將傳入列表中的所有引用複製到您現有的mList對象中。

含義:與updateList()相比,setList()確實需要更少的CPU操作...但關鍵是:現在mList可以從您的類的外部更改。如在:

List someList = ... 
yourClass.setList(someList); 
someList.clear(); 

將清除「你的」mList以及;但

List someList = ... 
yourClass.updateList(someList); 
someList.clear(); 

不會影響你的 「mList」。

這是您應該注意的主要區別。

表現其實並不是真正值得關注的問題!

一般:不要太擔心表現。因爲:無論如何你都不會做對。例如,JIT編譯器將天真假設顛倒過來。

長話短說:專注於語義的操作;不要將自己限制在「表現」方面。

+0

由於它是一個android問題,可能有一個適配器涉及某處。所以updateList會更好的使用。 –

+0

你也可以添加你自己的不可修改/不可修改的包裝,以防止污損操作之後。 – HRgiger

+0

@HRgiger凡人必須非常小心。只需在Collections中使用靜態方法創建一個包裝...當有人修改您創建包裝的「基礎集合」時,不會保護您的「包裝」集合。 – GhostCat

-1

setList更高效,因爲你只傳遞一個引用。清除並在列表中添加迭代。

但是你必須小心並知道傳遞引用或重置列表之間的區別,並使用對你的解決方案有用的東西。

2

setList()在CPU時間方面效率更高,因此工作量減少。但updateList()在開發人員時間可以說是更有效,因爲它不太可能導致錯誤。

效率之前,你要考慮正在做什麼。有兩個不同的列表可能在其他位置被引用(並可能被更改)。

例子:

使用setList()允許外部代碼修改代碼以意想不到的方式。

List<Data> someData = Arrays.asList(new Data("a"), new Data("b"); 
setList(someData); // mList contains "a" & "b" 
someData.clear(); // mList is now cleared 

但是相比之下updateList()免受意外的變化外

List<Data> someData = Arrays.asList(new Data("a"), new Data("b"); 
updateList(someData); // mList contains "a" & "b" 
someData.clear(); // mList still contains "a" & "b" 

當通過列表或從一個對象時,它通常是很好的做法,複製值。 CPU時間效率較低,但未來不太可能造成錯誤,因此在開發人員和維護時間方面效率更高。