Java 为什么打印输出不为空?

Java 为什么打印输出不为空?,java,list,arraylist,null,Java,List,Arraylist,Null,为什么会这样 List<String> list = new ArrayList<String>(); list.add("aaa"); String s = list.get(0); list.remove(0); System.out.println(s); List List=new ArrayList(); 列表。添加(“aaa”); 字符串s=list.get(0); 列表。删除(0); 系统输出打印项次; 控制台显示:aaa 谁能给我解释一下吗?我认为控制

为什么会这样

List<String> list = new ArrayList<String>();
list.add("aaa");
String s = list.get(0);
list.remove(0);
System.out.println(s);
List List=new ArrayList();
列表。添加(“aaa”);
字符串s=list.get(0);
列表。删除(0);
系统输出打印项次;
控制台显示:
aaa


谁能给我解释一下吗?我认为控制台应该是空的,应该是吗?

否。它工作正常
S
仍然包含对
“aaa”
的引用。您只更改了列表,而不是
S
字符串S=list.get(0)

您保存了对
s
的引用,然后打印了它的值。有什么问题吗

更改列表,而不是变量
s
s
仍然引用
“aaa”

您可能希望切换顺序:

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

否,因为您将列表中的值存储在
s
中。因此,对
“aaa”
的引用同时出现在列表和
s
中,在您将其从列表中删除后,
s
仍然引用它。

让我把它写进一个故事:

你给自己写了一张便条,上面写着“aaa”(只写
“aaa”
实际上定义了一个新字符串),以确保你永远不会忘记这一点。同时,你认为最好在冰箱上再钉一张便条,告诉你之前的便条放在哪里(
list.add(…)

在某个时刻,你会在冰箱上看到这个,并决定追踪你的笔记(
list.get(0)
)。然后你意识到你真的不再需要提醒了,因为你手里拿着便条,所以你把它从冰箱里拿出来(
list.remove(0)
)。你手里还拿着什么

我想,当您准确地写出代码中发生了什么,而不进行任何步骤时,会更加清楚:

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);
String note=“aaa”;
列表冰箱=新的ArrayList();
冰箱。添加(注);
注意=空;//忘了那张纸条吧,冰箱会记得的
String someNote=list.get(0);
冰箱。移除(0);//现在冰箱忘了,但你还留着纸条
System.out.println(someNote);

当然不应该。在将其从列表中删除之前,您已将“aaa”分配给
s
。所以很自然,它仍然存在…应该还有另一个关闭的原因。太尴尬了。:-)我建议您在调试器中单步执行代码,您将能够看到每一行的作用。您是想打印
list
而不是
s
s
仍然引用“aaa”实例您的答案是对的,但是在
这种情况下切换顺序会引发
java.lang.indexofbutoundsexception
!是的,我知道,我正在参考一种情况,在这种情况下,至少有2个元素感谢大家,我认为当操作列表。删除(0)完成时,应该从内存中删除obj。