我认为做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
答案 0 :(得分:5)
我认为做arraylist1 = arraylist2会使其中的2个共享相同的内存。
不完全是,它使这两个引用引用相同的单个对象。
如果没有他们这样做,我怎么能复制一个arraylist?
很多选择:
ArrayList
有copy constructor:
List<Integer> rezc = new ArrayList<>(rez);
List
有addAll
method:
List<Integer> rezc = new ArrayList<>();
rezc.addAll(rez);
ArrayList
有一个clone
method,但如果将rez
声明为List
,则使用起来有点难看,因为你必须假设它{&} #39;是ArrayList
并投了它,这可能不是一个好主意:
List<Integer> rezc = (List<Integer>)((ArrayList<Integer>)rez).clone();
在尝试解决这个问题时,通过JavaDoc阅读是非常值得的。
答案 1 :(得分:1)
语句arraylist1=arraylist2
表示它们引用相同的ArrayList对象。引用变量arraylist1
和arraylist2
指的是同一个对象,因此当您尝试通过arraylist1
如果你想创建一个新的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