Java - 复制数组列表

4

我知道下面的方法会导致两个变量都指向同一个对象,但如果我确实想要找到最简单的方法来使ArrayList s2与s1完全相同,我该怎么做?

public static void main(String[] args) {

        ArrayList<String> s1 = new ArrayList<String>();
        for (int i = 1; i <= 3; i++) {
            s1.add(""+i);
        }
        ArrayList<String> s2 = s1;

    }

1
请注意,在您的for循环中,您正在进行不必要的字符串连接。也许JVM会优化它,但我会使用Integer.toString(i)而不是""+i来获取int的字符串表示形式。 - rob
1个回答

5
你需要用s1作为参数创建s2。
public static void main(String[] args) {

    ArrayList<String> s1 = new ArrayList<String>();
    for (int i = 1; i <= 3; i++) {
        s1.add(""+i);
    }
    ArrayList<String> s2 = new ArrayList<String>(s1);

}

2
值得一提的是,虽然现在您有两个对不同列表的引用,但这些列表内部的引用是相同的,因此对存储在其中一个列表中的对象进行更改将影响另一个列表。当使用字符串(因为它们是不可变的)时不会出现问题,但在使用其他类型对象的列表时需要注意这一点。 - Anthony Grist
@LuiggiMendoza的解决方案也是我会使用的方法,但你也可以在创建一个新的空ArrayList<String>之后使用s2.addAll(s1)Collections.copy(s1, s2)CollectionsArrays类有很多其他实用方法,你可能想要复习一下,因为它们在某些时候会派上用场。 - rob
@rob 我并没有改进他的代码,只是展示了获取一个包含与s1 ArrayList相同数据的新ArrayList<String>的最简单方法。是的,我同意还有其他方法可以完成手头的任务,只是展示其中一种 :) - Luiggi Mendoza
@LuiggiMendoza 是的,我明白了。 :) 我想提到其他的选择,但觉得不必要单独回答,因为你的回答已经很好了。我还想向 Tim 介绍 Collections 和 Arrays 类,因为每个 Java 程序员都应该知道它们。 - rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接