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