我有这个代码。但我不知道如何解释结果:
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.
请为我解释。
谢谢:)
答案 0 :(得分:6)
通过分配second = first
,只有一个具有两个引用的arraylist。参考文献是相同的。因此,当使用两个引用之一(first
或second
)进行清除时,将对引用的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;
正在分配引用,因此第一个和第二个现在引用同一个对象。不会在赋值中或在参数传递中复制对象(复制/赋值的是引用)。