首页 文章

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

提问于
浏览
2

我已经看到很多关于使用字符串文字和新关键字创建的对象的问题:

How many String objects using new operator

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

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

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

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

2 回答

  • 2

    案例2:使用new()的String对象 . 它创建了2个对象,一个在字符串常量池中,另一个在堆区域中 .

    只有通过传递一个字符串文字来创建一个新的 String 对象,如下所示:

    String s = new String("hello");
    

    文字 "hello" 将导致创建字符串常量池中的对象 . new String 将在堆上创建一个新的 String 对象,其中包含文字对象内容的副本 .

    你永远不应该像这样创建 String 对象,因为它是不必要的和低效的 .

    但是,当您传递给构造函数的值不是字符串文字时,还有其他原因可以导致 new String(...) . 例如,该值是从文件读取的数据 .

  • 0

    案例1:使用字符串文字的字符串对象 . 它在字符串常量池中创建一个对象

    正确 .

    如果,它不存在

    错误 . 它存在 .

    否则,返回此对象的引用 .

    它总是返回对象的引用 . 没有'otherwise'关于它 .

    此对象是隐式实现的 .

    并不是的 . 它已经被实习,因为它是一个字符串文字 . 编译器和类加载器可以看到它 . 不是 new 运算符 .

    案例2:使用new()的String对象 . 它创建了2个对象,一个在字符串常量池中

    并不是的 . 它已经存在了:见上文 .

    和堆区域中的另一个 .

    正确 .

    引用变量引用堆区域对象 . 对于此对象,我们需要调用intern方法将此对象显式地放入字符串常量池中 .

    正确 .

    我的问题是new()是否已经在字符串常量池中创建了一个对象

    它没有 . 往上看 .

相关问题