2012-04-12 99 views
3

我有这段代码。但我不知道该如何解释结果:将两个arrayList引用到同一对象

ArrayList<String> first = new ArrayList<String>(); 
     first.add("1"); 
     first.add("2"); 
     first.add("3"); 

     ArrayList<String> second = new ArrayList<String>(); 
     second = first; 
     System.out.println("before modified:"+second.size()); 
     second.clear(); 
     System.out.println("after modified:"); 
     System.out.println(" First:"+first.size()); 
     System.out.println(" Second:"+second.size()); 

结果将是:3/0/0

我不知道的问题是:当你将first = second;所以,无论是第一第二个数组将指向相同的对象(1,2和3)。在第二个数组上的所有元素之后,第二个数组和这些对象之间的所有引用都会松动(这里没有问题)。

我不知道的事情是:但这些对象(1,2和3)仍持有参照第一阵列。为什么第一个数组的大小为0。

请给我解释一下。

谢谢:)

+0

请参阅此链接http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java – aProgrammer 2012-04-12 07:44:50

回答

6

通过分配second = first,只有一个ArrayList中有两个引用。引用是一样的。因此,当使用两个参考文件(firstsecond)中的一个呼叫清除时,清除将在引用的数组列表上执行。

这是你第一次想到的东西。这并不是因为将second = first的所有引用添加到第一个字符串中,都将被复制到一个新的ArrayList对象中,这在Java中是非常神奇的。

1

但这些对象(1,2和3)仍持有参考第一阵列。 为什么第一个数组的大小为0。

ArrayList<String> second = new ArrayList<String>(); 
second = first; 

是一样的书写

ArrayList<String> second = first; 

你已经做了第二个基准点到第一ArrayList中,所以不能用一个新的ArrayList。所以当你打电话清除它清除“第一”阵列创建 - 你有两个引用指向一个ArrayList。

3

当你做你的first = second ArrayList的项目将指向相同的内存位置。执行.clear将删除ArrayList指向的元素。这会对其他ArrayList产生影响。

如果你只是想的ArrayList1的元素复制到ArrayList2,你可以不喜欢这样:ArrayList<String> second = new ArrayList<String>(first);

1

当你将一个ArrayList的两个变量,并修改它们中的任何一个,这将在这两个反映。所以在一个变量中执行的操作也反映在第二个变量中。 (由两个变量引用的单个对象)。

1

在Java一个变量(除了原语)始终是一个参考(其具有对象的开始地址)到一个对象只,参考是从未在自身的对象。

例如

second = first;

被分配一个参考,使得第一和第二现在指的同一个对象。对象不会被复制,既不在赋值中,也不在参数传递中(复制/分配的是引用)。

相关问题