所以我读过,如果你这样写:
String a="foo";
String b="foo";
System.out.println(a==b);
它会显示“ true”,因为第一个实现会检查内存池中是否存在“ foo”,因此无法找到它,因此它将创建一个新对象并将foo放入内存池中,然后其他所有字符串将指向同一对象。
并且如果您写:
String a="foo";
String b=new String("foo");
System.out.println(a==b);
它会显示“ false”,因为您为b强制创建了一个新对象,因此它不会从池中取出它。
我的问题是,如果你这样写:
String a=new String("foo");
String b="foo";
System.out.println(a==b);
为什么仍显示“ false”?我的意思是“ a”创建一个新对象并且不在内存池中查找,但是b应该在内存池中查找并找到创建的对象“ a”并指向它。我在这里想念什么?
谢谢。
最佳答案
创建新对象时,它不在池中。
b应该在内存池中查找并找到创建的对象“ a”并指向它。
它在池中,但是它返回"foo"
对象而不是new String("foo")
对象,因此==
仍然为false。
您可以使用.intern()
将字符串放入池中,例如
String a = "food".substring(0, 3).intern();
String b = "foo";
assert a == b;
关于java - 比较内存池中已经存在的Java中的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42156815/