所以我读过如果你写这个:
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”并指向它。我在这里想念的是什么? 谢谢。
答案 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会转到 - 所以引用不同。这就是你弄错的原因。