在以下代码段中创建了多少个不同的String
对象实例?
String s1 = new String("hello");
String s2 = "GoodBye";
String s3 = s1;
我不确定这里的所有推理。
通过使用从new
类创建实例的关键字String
,我猜这必须是一个对象。但是,我很困惑,String
现在被认为是一个方法,因为它有()然后它在其中调用new
文字“你好”,是String
吗?
String s2 = "Goodbye";
我认为这是一个字符串文字,因为字符串实际上是对象,所以即使字符串文字被认为是对象。 不是100%确定是否属实。
String s3 = s1;
只是回到s1。因此,它并不明显。
所以我的答案是2个不同的对象。
请解释我是对还是错。
答案 0 :(得分:6)
正确的答案是3。
String s1 = new String("hello");
String s2 = "GoodBye";
String s3 = s1;
编译器会在编译期间将文字“hello”和“GoodBye”放入“常量池”,然后由类加载器加载。因此,当JVM加载该类时,它会自动插入此类使用的所有String文字。更多相关信息:When are Java Strings interned?。然后在运行时管理String constant pool。
在运行时,JVM将在到达第String s1 = new String("hello")
行时创建第三个String对象。
所以你会想到三个不同的String对象,其中两个包含相同的单词“hello”。因此s1.equals("hello")
将为true
,但s1 == "hello"
将为false
,因为s1
引用堆上的其他字符串,而不是文字“你好“
行String s3 = s1
只创建一个变量s3
,其中复制了对s1
的String对象的引用。它不创建一个新对象。
还要注意,您可以使用方法String#intern
“手动”将字符串添加到字符串常量池中。所以s1.intern() == "hello"
是true
,因为从s1.intern()
返回的String引用是对已经在常量池中的文字“hello”的引用。
如果您想通过一些关于对象及其位置的图纸获得另一个更详细的说明,可以查看this article on javaranch。