java替换列表内容或替换引用值本身

时间:2014-07-31 03:07:15

标签: java android

我有一个用于Android中ListView适配器的列表。

大多数时候,List用于读取,但有时需要替换所有List内容。

以下哪种代码(replaceListA,replaceListB)是首选?或其他方式来取代名单?

提前谢谢你。

private ArrayList<Model> list = new ArrayList<Model>();

public synchronized void replaceListA(List newList) {
            list.clear();
            list.addAll(newList);
}

public synchronized void replaceListB(List newList) {
    list = newList;
}

3 个答案:

答案 0 :(得分:1)

请参阅this answer

  

如果没有基准测试很难知道,但如果您ArrayList中有很多项目且平均尺寸较低,那么制作新ArrayList可能会更快。

答案 1 :(得分:1)

通常,replaceListB可能会运行得更快,但如果稍后修改newListlist也会更改。例如:

ArrayList<Model> newList = new ArrayList<Model>();
replaceListB(newList);
newList.add( /*something*/ ); //This will update both newList and list

相比之下

ArrayList<Model> newList = new ArrayList<Model>();
replaceListA(newList);
newList.add( /*something*/ ); //This will only update newList

更具体地说,replaceListB将在恒定的时间内运行,因为它只是更改指针,其中replaceListA必须单独复制列表的每个元素,因此它将如果列表很大,需要很长时间。但是,根据垃圾收集器的详细信息,replaceListA可能会更快地释放内存。无论哪种方式,除非列表非常大,否则不太可能产生重大差异,因此我建议根据您是否要单独制作列表副本(replaceListA)或允许编辑({{1 }})。

答案 2 :(得分:0)

第二个是首选。它在O(1)时间运行,另一个在O(n)时间运行。请务必在事后调用notifyDataSetChanged。