Android列表(ArrayList,List等):addAll()vs重新定义引用

时间:2016-05-31 15:04:06

标签: java android performance list arraylist

如果我有类似的话:

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问题混淆。

3 个答案:

答案 0 :(得分:11)

两者之间存在巨大的概念差异。

您的setList()会引用一个列表;并更改你的mList ...指向该参考。

updateList()将来自传入列表的所有引用复制到现有的mList对象中。

含义:与updateList()相比,setList()确实需要更少的CPU操作......但关键是:现在可以从类外部更改mList。喜欢在:

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

将清除&#34;您的&#34; mList也是;但

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

影响您的&#34; mList&#34;。

这是你应该注意的主要区别。

性能实际上并不是真正需要关注的问题!

一般情况下:不要过分担心性能问题。因为:无论如何你都不会把它弄好。例如,JIT编译器颠倒了天真的假设。

长话短说:专注于语义的运营;不要将自己限制在&#34;表现&#34;方面。

答案 1 :(得分: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时间效率较低,但未来不太可能导致错误,因此开发人员和维护时间更有效。

答案 2 :(得分:-1)

setList更有效,因为你只传递一个引用。清除并在列表上添加迭代。

但是你必须小心并知道传递引用或重置列表之间的区别,并使用对你的解决方案有用的东西。