我有一个用于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;
}
答案 0 :(得分:1)
请参阅this answer。
如果没有基准测试很难知道,但如果您
ArrayList
中有很多项目且平均尺寸较低,那么制作新ArrayList
可能会更快。
答案 1 :(得分:1)
通常,replaceListB
可能会运行得更快,但如果稍后修改newList
,list
也会更改。例如:
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。