Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用另一个数组列表替换一个数组列表_Java_List_Arraylist_Collections - Fatal编程技术网

Java 用另一个数组列表替换一个数组列表

Java 用另一个数组列表替换一个数组列表,java,list,arraylist,collections,Java,List,Arraylist,Collections,在我的业务逻辑中,我想用另一个列表完全替换一个列表 下面的方法正确吗 public class TestListReplacement { public static void main(String[] args) { List<String> values= new ArrayList<String>(); values.add("a"); values.add("b"); values.ad

在我的业务逻辑中,我想用另一个列表完全替换一个列表

下面的方法正确吗

public class TestListReplacement {

    public static void main(String[] args) {

        List<String> values= new ArrayList<String>();
        values.add("a");
        values.add("b");
        values.add("c");
        values.add("d");
        values.add("e");
        values.add("f");

        List<String> valuesNew= new ArrayList<String>();
        valuesNew.add("g");
        valuesNew.add("h");
        valuesNew.add("i");
        valuesNew.add("j");
        valuesNew.add("k");

        values= valuesNew;
        for(String val:values){
            System.out.println(val);
        }
    }
}
公共类TestListReplacement{
公共静态void main(字符串[]args){
列表值=新的ArrayList();
价值。添加(“a”);
价值。添加(“b”);
价值。添加(“c”);
价值。添加(“d”);
价值。添加(“e”);
价值。添加(“f”);
列表值new=新的ArrayList();
新增加的价值(“g”);
新增加的价值(“h”);
新增加的价值(“i”);
新增加的价值(“j”);
新增加的价值(“k”);
值=新值;
for(字符串值:值){
系统输出打印项次(val);
}
}
}

这似乎很好,但我想知道在某些用例中,它是否可能不起作用。

如果我正确理解了您试图做的事情,那么

values.clear(); // delete original contents in the list
values.addAll(valuesNew); // insert everything in the new list
要从@nbrooks和其他人的答案中添加更多上下文,请执行以下操作:
覆盖引用并不总是一种选择,坦率地说,在实践中,对集合进行两次迭代所感觉到的低效几乎总是无关紧要的。如果您需要保留相同的列表实例(因为它在代码中的其他位置被引用),则覆盖变量不会更新这些其他位置。

如果我正确理解您试图执行的操作,那么

values.clear(); // delete original contents in the list
values.addAll(valuesNew); // insert everything in the new list
要从@nbrooks和其他人的答案中添加更多上下文,请执行以下操作:
覆盖引用并不总是一种选择,坦率地说,在实践中,对集合进行两次迭代所感觉到的低效几乎总是无关紧要的。如果您需要保留相同的列表实例(因为它在代码中的其他位置被引用),则覆盖变量不会更新这些其他位置。

这是正确的,并且会一直工作。您的代码不会对列表执行任何特定操作。它只是显示一个变量的对象引用被另一个对象引用覆盖。如果您试图更新现有列表中的值,那么代码不会这样做。如果您希望代码中引用该列表的其他位置可以看到新值,那么这种情况就不会发生。根据您上面的描述和单独的代码示例,不清楚您试图解决的问题是什么,以及您的解决方案是否有效。实际上,这个问题与(和其他一些问题)是重复的。它是正确的,并且会一直有效。您的代码没有对列表执行任何特定操作。它只是显示一个变量的对象引用被另一个对象引用覆盖。如果您试图更新现有列表中的值,那么代码不会这样做。如果您希望代码中引用该列表的其他位置可以看到新值,那么这种情况就不会发生。根据您上面的描述和单独的代码示例,不清楚您试图解决什么问题,以及您的解决方案是否有效。实际上,这个问题与(和其他一些问题)是重复的。@Jonny因为如果列表是其他类的成员,后者没有任何效果?不同的问题有不同的解决方案,这个答案最简单,可以用新值替换给定列表中的所有值。覆盖变量不会改变对初始现有列表的其他引用。@nbrooks调用
clear()
不是在浪费时间吗?你宁愿简单地去掉引用,GC也会为你做一些肮脏的工作,@Debosmit这取决于OP的用例,而他们没有提供。覆盖引用并不总是一种选择,坦率地说,在实践中,对集合进行两次迭代所感觉到的低效几乎总是无关紧要的。如果需要保留相同的列表实例(因为它在代码中的其他位置被引用),则覆盖变量不会更新这些其他位置。@nbrooks我完全忽略了一个事实,即在其他位置可能有其他引用会导致异常。非常感谢你的来信。我真的很感激。@Jonny我不会费心为这个问题键入答案,因为这个问题已经在几个地方得到了回答。有一个类似的回答。@Jonny,因为如果列表是某个其他类的成员,则后者没有效果?不同的问题有不同的解决方案,这个答案最简单,可以用新值替换给定列表中的所有值。覆盖变量不会改变对初始现有列表的其他引用。@nbrooks调用
clear()
不是在浪费时间吗?你宁愿简单地去掉引用,GC也会为你做一些肮脏的工作,@Debosmit这取决于OP的用例,而他们没有提供。覆盖引用并不总是一种选择,坦率地说,在实践中,对集合进行两次迭代所感觉到的低效几乎总是无关紧要的。如果需要保留相同的列表实例(因为它在代码中的其他位置被引用),则覆盖变量不会更新这些其他位置。@nbrooks我完全忽略了一个事实,即在其他位置可能有其他引用会导致异常。非常感谢你的来信。我真的很感激。@Jonny我不会费心为这个问题键入答案,因为这个问题已经在几个地方得到了回答。也有类似的反应。