3

我有这个代码。但我不知道如何解释结果:

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。

请为我解释。

谢谢 :)

4

5 回答 5

6

通过分配second = first,只有一个带有两个引用的数组列表。参考文献是一样的。因此,当使用两个引用(firstsecond)之一调用 clear 时,将对引用的 arraylist 执行 clear。

这与您最初的想法不同。并不是将second = first您添加到第一个字符串的所有引用分配到一个新的 ArrayList 对象中,这将是魔术(在 Java 中)。

于 2012-04-12T07:40:02.507 回答
3

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

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

于 2012-04-12T07:42:05.393 回答
1

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

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

和写一样

ArrayList<String> second = first;

您已经对第一个数组列表进行了第二个引用,它没有使用新的数组列表。因此,当您调用 clear 时,它会清除创建的“第一个”arraylist - 您有两个指向一个 arraylist 的引用。

于 2012-04-12T07:41:25.787 回答
1

当您将一个 ArrayList 分配给两个变量并修改其中任何一个时,这将反映在两者中。因此,在任何一个变量中执行的操作也会反映在第二个变量中。(由两个变量引用的单个对象)。

于 2012-04-12T07:42:20.850 回答
1

在 Java 中,变量(除了原语)始终只是对对象的引用(具有对象的起始地址),引用本身绝不是对象。

例如

第二=第一;

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

于 2012-04-12T07:47:51.393 回答