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

java替换列表内容或替换引用值本身,java,android,Java,Android,我有一个用于Android中ListView适配器的列表 大多数情况下,列表用于读取,但有时需要替换所有列表内容 下面哪种类型的代码(replaceListA、replaceListB)是首选代码?还是用另一种方法来取代这个列表 先谢谢你 private ArrayList<Model> list = new ArrayList<Model>(); public synchronized void replaceListA(List newList) {

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

大多数情况下,列表用于读取,但有时需要替换所有列表内容

下面哪种类型的代码(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;
}
private ArrayList list=new ArrayList();
公共同步的void replaceListA(列表newList){
list.clear();
list.addAll(newList);
}
公共同步的void replaceListB(列表新建列表){
列表=新列表;
}

首选第二种。它在O(1)时间内运行,另一个在O(n)时间内运行。之后一定要调用notifyDataSetChanged。

请参阅

没有基准很难知道,但是如果
ArrayList
中有很多项,并且平均大小较低,那么创建新的
ArrayList
可能会更快


一般来说,
replaceListB
可能会运行得更快,但如果以后修改了
newList
list
也会改变。例如:

ArrayList<Model> newList = new ArrayList<Model>();
replaceListB(newList);
newList.add( /*something*/ ); //This will update both newList and list
ArrayList newList=new ArrayList();
替换列表B(新列表);
添加(/*something*/)//这将同时更新newList和list
相比之下

ArrayList<Model> newList = new ArrayList<Model>();
replaceListA(newList);
newList.add( /*something*/ ); //This will only update newList
ArrayList newList=new ArrayList();
替换列表A(新列表);
添加(/*something*/)//这将只更新newList

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

调用此方法后是否可能编辑
newList
,不需要。需要不同的方式吗?按情况?如果调用该方法后更新了
newList
,它也可能会更改
list
的值(如果使用
replaceListB
)。视情况而定,你可能想这样做,也可能不想这样做。你应该投票以重复的方式结束。