我有以下代码块:
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Integer> list2 = list1;
// both list1 and list2 are empty arraylists
System.out.println(list1.size()); // prints: 0
list2.add(7);
System.out.println(list1.size()); // prints: 1
为什么我修改list2时,list1也被修改了?这导致我的程序中出现ConcurrentModificationException
个。如何在不更改list1的情况下编辑list2?
答案 0 :(得分:7)
list1
和list2
是您设置为引用同一对象的两个不同引用。
如果您想要两个具有相同内容的不同列表,您可以复制:
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<Integer>(list1);
答案 1 :(得分:2)
在Java编程语言中,变量的值仅存储在基本类型中。对于Object(和其他类),存储的值是对实际对象的引用。
在您的示例中,您只是创建一个变量list2,其引用指向对象list1,因此它是一个不同的变量,但具有相同的引用值并指向同一个对象。这就是为什么当你向list1添加一个元素时,list2也会受到影响(它实际上是同一个列表。只是一个重复的引用)。
为了更改此行为,您需要使list2等于新的ArrayList(),使其成为一个空的新ArrayList,或者使用copy-constructor并将list1作为参数传递。