为什么发生这种情况?为什么打印输出不为空?
List<String> list = new ArrayList<String>();
list.add("aaa");
String s = list.get(0);
list.remove(0);
System.out.println(s);
控制台说:aaa
有人可以解释一下吗?我以为控制台应该是null
,应该是?
为什么发生这种情况?为什么打印输出不为空?
List<String> list = new ArrayList<String>();
list.add("aaa");
String s = list.get(0);
list.remove(0);
System.out.println(s);
控制台说:aaa
有人可以解释一下吗?我以为控制台应该是null
,应该是?
不,它按预期工作。 S
仍然保留对"aaa"
的引用。您只更改了列表,而不是S
。
'S'仍然保留对“aaa”实例的引用 – 2013-05-06 09:20:52
String s = list.get(0);
保存的参照s
,然后印刷它的价值。有什么问题?
List#remove更改列表,而不是变量s
, s
仍然有参考"aaa"
。
你可能想切换顺序:
list.remove(0);
String s = list.get(0);
没有,因为你存储在一个s
从列表中选择值。因此,对"aaa"
的引用在列表和s
中,在您从列表中删除后,s
仍然引用它。
感谢你们所有人,我认为obj shound被从内存中删除,当操作list.remove(0)是完成。 – kevin 2013-05-06 10:16:22
让我将它放入一个故事:
你自己写的一张纸条上写着“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);
非常感谢 – kevin 2013-05-06 10:17:11
当然它不应该。在将其从列表中删除之前,您已将“aaa”分配给了's'。所以很自然,它仍然存在...... – 2013-05-06 09:17:40
应该有另一个关闭原因。太尴尬了。 :-) – 2013-05-06 09:18:58
我建议你在调试器中逐步执行代码,并且你将能够看到每行代码的功能。 – 2013-05-06 09:24:15