如果使用new运算符创建对象,为什么在String中使用intern方法?

时间:2014-12-20 08:01:53

标签: java string object

我见过许多关于使用字符串文字和新关键字创建的对象的问题,如:

How many String objects using new operator

但它并没有澄清我的怀疑。

案例1:使用字符串文字的字符串对象。 它在字符串常量池中创建一个对象,如果它不存在,则返回该对象的引用。该对象是隐式实现的。

案例2:使用new()的String对象。 它创建了2个对象,一个在字符串常量池中,另一个在堆区域中。引用变量引用堆区域对象。对于这个对象,我们需要调用intern方法将该对象显式地放入字符串常量池中。

我的问题是,如果new()已经在字符串常量池中创建了一个对象,那么在堆区域中的对象上使用调用intern方法有什么用?

2 个答案:

答案 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()是否已在字符串常量池中创建一个对象

它没有。见上文。