2013-05-06 130 views
-2

为什么发生这种情况?为什么打印输出不为空?

List<String> list = new ArrayList<String>(); 
list.add("aaa"); 
String s = list.get(0); 
list.remove(0); 
System.out.println(s); 

控制台说:aaa

有人可以解释一下吗?我以为控制台应该是null,应该是?

+1

当然它不应该。在将其从列表中删除之前,您已将“aaa”分配给了's'。所以很自然,它仍然存在...... – 2013-05-06 09:17:40

+1

应该有另一个关闭原因。太尴尬了。 :-) – 2013-05-06 09:18:58

+0

我建议你在调试器中逐步执行代码,并且你将能够看到每行代码的功能。 – 2013-05-06 09:24:15

回答

1

不,它按预期工作。 S仍然保留对"aaa"的引用。您只更改了列表,而不是S

+0

'S'仍然保留对“aaa”实例的引用 – 2013-05-06 09:20:52

1

String s = list.get(0);

保存的参照s,然后印刷它的价值。有什么问题?

List#remove更改列表,而不是变量s, s仍然有参考"aaa"

你可能想切换顺序:

list.remove(0); 
String s = list.get(0); 
+0

你的回答是正确的,但是在'THIS'情况下切换顺序会抛出'java.lang.IndexOutOfBoundsException'! – SudoRahul 2013-05-06 09:25:49

+0

是的,我知道,我正在重申一个情况,其中至少有两个元素 – Maroun 2013-05-06 09:33:48

+0

你很亲切 – kevin 2013-05-06 10:20:45

5

没有,因为你存储在一个s从列表中选择值。因此,对"aaa"的引用在列表和s中,在您从列表中删除后,s仍然引用它。

+0

感谢你们所有人,我认为obj shound被从内存中删除,当操作list.remove(0)是完成。 – kevin 2013-05-06 10:16:22

1

让我将它放入一个故事:

你自己写的一张纸条上写着“AAA”(只写"aaa" actualy定义了一个新的字符串),以确保您永远不会忘记这一点。同时,您决定将另一张纸条钉在冰箱上告诉您先前放置纸币的位置(list.add(...))可能是个好主意。

在某些情况下,您在冰箱上看到此信息并决定追踪您的笔记(list.get(0))。然后你意识到你不再需要提醒了,因为你手中拿着纸条,所以你从冰箱里取出纸条(list.remove(0))。你还握着什么?

我想这将是更加清晰,当你写出来的代码究竟发生了什么,没有任何ommitting步骤:

String note = "aaa"; 
List<String> fridge = new ArrayList<String>(); 
fridge.add(note); 
note = null; // forget about the note, the fridge will remember 

String someNote = list.get(0); 
fridge.remove(0); // now the fridge forgets, but you still have the note 
System.out.println(someNote); 
+0

非常感谢 – kevin 2013-05-06 10:17:11