将两个arrayList引用到相同的对象

时间:2012-04-12 07:38:06

标签: java reference 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)。在clear第二个数组上的所有元素之后,第二个数组和这些对象之间的所有引用都会松散(这里没问题)。

我不知道的是:但是这些对象(1,2和3)仍然引用第一个数组。为什么第一个数组的大小为0.

请为我解释。

谢谢:)

5 个答案:

答案 0 :(得分:6)

通过分配second = first,只有一个具有两个引用的arraylist。参考文献是相同的。因此,当使用两个引用之一(firstsecond)进行清除时,将对引用的arraylist执行clear。

这不是你想到的。并非如此,将second = first所有引用的字符串的引用分配给第一个字符串,将被复制到一个新的ArrayList对象中,这将是魔术(在Java中)。

答案 1 :(得分:3)

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

如果您只想将ArrayList1的元素复制到ArrayList2,您可以执行以下操作:ArrayList<String> second = new ArrayList<String>(first);

答案 2 :(得分:1)

  

但是这些对象(1,2和3)仍然引用第一个数组。   为什么第一个数组的大小为0。

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

与写作相同

ArrayList<String> second = first;

你已经对第一个arraylist提出了第二个参考点,它没有使用新的arraylist。因此,当你打电话给它时,它会清除所创建的“第一个”arraylist - 你有两个引用指向一个arraylist。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

在Java中,变量(基元除外)始终是对象的引用(它具有对象的起始地址),引用本身不是对象。

例如

second = first;

正在分配引用,因此第一个和第二个现在引用同一个对象。不会在赋值中或在参数传递中复制对象(复制/赋值的是引用)。