为什么原始变量会在新变量发生变化时发生变化?

时间:2014-11-11 01:13:49

标签: java arraylist iteration concurrentmodification

我有以下代码块:

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?

2 个答案:

答案 0 :(得分:7)

list1list2是您设置为引用同一对象的两个不同引用。

如果您想要两个具有相同内容的不同列表,您可以复制:

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作为参数传递。