【问题标题】:Replace one array list with other list [closed]用另一个列表替换一个数组列表[关闭]
【发布时间】:2016-03-24 05:30:24
【问题描述】:

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

下面的方法正确吗?

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);
        }
    }
}

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

【问题讨论】:

  • 它是正确的,并且会一直工作
  • 您的代码没有对列表执行任何特定操作。它只是显示变量的对象引用被不同的对象引用覆盖。如果您尝试更新现有列表中的值,那不是您的代码正在做的事情。如果您希望代码中引用该列表的其他位置可以看到新值,则不会发生这种情况。根据您上面的描述和孤立的代码示例,尚不清楚您要解决什么问题,以及您的解决方案是否有效。
  • 其实这个问题是stackoverflow.com/questions/3823398/…(和其他几个)的重复。

标签: java list arraylist collections


【解决方案1】:

如果我理解正确你想要做什么,那么

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 我不会费心为这个问题输入答案,因为这个问题已经在几个地方得到了回答。有类似的回复here
猜你喜欢
  • 2019-01-04
  • 2013-08-26
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
相关资源
最近更新 更多