比较java中已存在于内存池中的字符串

时间:2017-02-10 10:17:27

标签: java

所以我读过如果你写这个:

AssemblyVersion

它将打印“true”,因为第一个实现检查内存池寻找“foo”,它无法找到它所以它创建一个新对象并将foo放入内存池,然后每个其他字符串将指向同一个对象。

如果你写:

String a="foo"; 
String b="foo"; 
System.out.println(a==b);

它会打印“false”,因为你强制为b创建一个新对象,所以它不会从池中取出它。

我的问题是如果你这样写:

String a="foo"; 
String b=new String("foo"); 
System.out.println(a==b);

为什么它仍然打印“假”?我的意思是“a”创建一个新对象并且不查看内存池,但是b应该查看内存池并找到创建的对象“a”并指向它。我在这里想念的是什么? 谢谢。

5 个答案:

答案 0 :(得分:1)

创建新对象时,它不在池中。

  

b应该查看内存池并找到对象" a"创造并指向它。

它在池中,但它返回<group android:checkableBehavior="single"> <item android:id="@+id/nav_first" android:title="First" /> <item android:id="@+id/nav_second" android:title="Second" /> <item android:id="@+id/nav_third" android:title="Third" /> </group> 对象而不是"foo"对象,因此new String("foo")仍然是假的。

您可以使用==将字符串放入池中,例如

.intern()

答案 1 :(得分:1)

String a="foo";

- &GT;检查字符串池,如果字符串池没有,请在字符串池中创建一个新的字符串对象

String b="foo";

- &GT;检查字符串池,如果字符串池包含它,则引用该字符串对象。

String c=new String("foo");

它直接在String池外创建一个新的String对象,但是在Object pool(Memory)中。

从对象的角度来看,2 String对象是相同的,因此如果使用.equals来比较这些2,它将返回true。但是如果使用==进行比较,它会比较引用,它不指向同一个对象,因此返回false。

了解更多详情: http://theopentutorials.com/tutorials/java/strings/string-literal-pool/

答案 2 :(得分:1)

你误解了游泳池的工作方式:当你做的时候

rsconnect::deployApp()

String a = "foo"; 对象String最终会在池中结束,不是因为您首先创建它,而是因为它是基于字符串文字的对象(一系列字符)在双引号内)。 Java在常量池中为您创建此对象。

写作时

"foo"

池中的字符串对象String a = new String("foo"); 被复制到一个新的"foo"对象中,该对象放置在池中。

答案 3 :(得分:0)

尽管公共池通常是堆的一部分,但是通过new创建的对象永远不会进入池,而创建时使用的文字将转到池中。当你比较文字时你说的是真的。不是反对文字和对象。

答案 4 :(得分:-1)

字符串a不会转到字符串池,字符串b会转到 - 所以引用不同。这就是你弄错的原因。