我已经看到很多关于使用字符串文字和新关键字创建的对象的问题:
How many String objects using new operator
但它并没有澄清我的怀疑 .
情况1:使用字符串文字的字符串对象 . 它在字符串常量池中创建一个对象,如果它不存在,则返回该对象的引用 . 该对象是隐式实现的 .
情况2:使用new()的String对象 . 它创建了2个对象,一个在字符串常量池中,另一个在堆区域中 . 引用变量引用堆区域对象 . 对于此对象,我们需要调用intern方法将此对象显式放入字符串常量池中 .
我的问题是,如果new()已经在字符串常量池中创建了一个对象,那么在堆区域中的对象上调用intern方法有什么用?
2 回答
只有通过传递一个字符串文字来创建一个新的
String
对象,如下所示:文字
"hello"
将导致创建字符串常量池中的对象 .new String
将在堆上创建一个新的String
对象,其中包含文字对象内容的副本 .你永远不应该像这样创建
String
对象,因为它是不必要的和低效的 .但是,当您传递给构造函数的值不是字符串文字时,还有其他原因可以导致
new String(...)
. 例如,该值是从文件读取的数据 .正确 .
错误 . 它存在 .
它总是返回对象的引用 . 没有'otherwise'关于它 .
并不是的 . 它已经被实习,因为它是一个字符串文字 . 编译器和类加载器可以看到它 . 不是
new
运算符 .并不是的 . 它已经存在了:见上文 .
正确 .
正确 .
它没有 . 往上看 .