所以我读过,如果你这样写:

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/

10-12 03:55