复制arraylist

时间:2014-03-23 15:50:23

标签: java arraylist

我认为做arraylist1=arraylist2会使其中的2个共享相同的内存。如果没有他们这样做,我怎么能复制一个arraylist?我想分开对待他们。

 List<Integer> rez = new ArrayList<>();
 List<Integer> rezc = new ArrayList<>();

        rez.add(1);
        rezc=rez;
         rezc.add(2);
        for (int s : rez) {
                System.out.print(s + " ");
            }//this will print 1 2

5 个答案:

答案 0 :(得分:5)

  

我认为做arraylist1 = arraylist2会使其中的2个共享相同的内存。

不完全是,它使这两个引用引用相同的单个对象。

  

如果没有他们这样做,我怎么能复制一个arraylist?

很多选择:

  1. ArrayListcopy constructor

    List<Integer> rezc = new ArrayList<>(rez);
    
  2. ListaddAll method

    List<Integer> rezc = new ArrayList<>();
    rezc.addAll(rez);
    
  3. ArrayList有一个clone method,但如果将rez声明为List,则使用起来有点难看,因为你必须假设它{&} #39;是ArrayList并投了它,这可能不是一个好主意:

    List<Integer> rezc = (List<Integer>)((ArrayList<Integer>)rez).clone();
    
  4. 在尝试解决这个问题时,通过JavaDoc阅读是非常值得的。

答案 1 :(得分:1)

语句arraylist1=arraylist2表示它们引用相同的ArrayList对象。引用变量arraylist1arraylist2指的是同一个对象,因此当您尝试通过arraylist1 arraylist2所做的更改>

如果你想创建一个新的ArrayList,ArrayList rezc = new ArrayList(rez)

答案 2 :(得分:1)

而不是此行rezc=rez;

使用List<Integer> rezc = new ArrayList<>(rez);

答案 3 :(得分:1)

长手方式是for循环遍历一个列表,同时将所有项添加到第二个列表。像

这样的东西
for (int I = 0; I < rez.size() I++) {
    rezc.add(rez.get(I)); }

但之前的答案效率更高。

答案 4 :(得分:1)

如果我理解正确,您正在谈论Java浅层克隆v / s深度克隆。在这种情况下,以下代码可能会有所帮助

List<Integer> rez = new ArrayList<>();
List<Integer> rezc = new ArrayList<>();
rez.add(1);
rezc.addAll(rez); // addAll
List<Integer> rezc2 = (List<Integer>)((ArrayList<Integer>)rez).clone(); //clone