String
在以下代码段中创建了多少个不同的对象实例?
String s1 = new String("hello");
String s2 = "GoodBye";
String s3 = s1;
不确定我在这里的所有推理。
通过使用new
从String
类创建实例的关键字,我猜想它必须是一个对象。但是,令我感到困惑的是String
,在new
现在考虑了方法之后,是因为它具有(),然后在其中调用了String
文字“ hello”吗?
String s2 = "Goodbye";
我认为这是一个字符串文字,并且因为字符串实际上是对象,所以即使字符串文字也被视为对象。不能100%确定那是真的。
String s3 = s1;
只是指回s1。因此,它不是唯一的。
所以我的答案是2个不同的对象。
请说明我是对是错。
正确答案是3。
String s1 = new String("hello");
String s2 = "GoodBye";
String s3 = s1;
编译器将在编译期间将文字“ hello”和“ GoodBye”都放入“常量池”,然后由类加载器加载。因此,JVM在加载该类时会自动实习该类使用的所有String文字。有关此内容的更多信息:Java字符串何时被拦截?。然后在运行时对字符串常量池进行管理。
在运行时,JVM将在到达该行时创建第三个String对象String s1 = new String("hello")
。
因此,您将拥有三个不同的String对象,其中两个对象包含相同的单词“ hello”。那样s1.equals("hello")
会是true
,但是s1 == "hello"
会这样false
,因为s1
对堆的引用不同于文字“ hello”。
该行String s3 = s1
仅创建一个变量s3
,该变量具有对的String对象的复制引用s1
。它不会创建新对象。
另外请注意,您可以使用方法将字符串“手动”添加到String常量池中String#intern
。所以,s1.intern() == "hello"
是true
的,因为从返回的字符串的参考s1.intern()
是参考文本“你好”这是已经在常量池。
如果您想获得有关对象及其位置的某些图形的另一个甚至更详细的解释,可以在javaranch上查看此文章。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句