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