栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用new创建字符串对象并将其与intern方法进行比较

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用new创建字符串对象并将其与intern方法进行比较

TL; DR :如果您确实需要做

new String("abc")
,您将知道自己需要,并且会知道为什么。这种情况非常罕见, 几乎
可以说您不需要。只需使用
"abc"


长版:

当您拥有代码时

new String("abc")
,以下情况会在不同时间发生:

  • 加载包含该代码的类时,如果内部存储
    "abc"
    池中尚未包含带有字符的字符串,则会将其创建并放在其中。
  • new String("abc")
    代码运行:
    • "abc"
      来自内部缓冲池的字符串的引用将传递到
      String
      构造函数中。
    • 通过将传递过来的字符复制到构造函数中,可以创建并初始化一个
      String
      对象
      String
    • String
      对象将返回给您。

如果使用new创建的字符串“
abc”也将字符串放置在池中,那么为什么

intern()
说如果字符串池包含字符串则返回池中的字符串,否则将字符串对象添加到池中。

因为那是什么

intern
。请注意,调用
intern
字符串文字是禁止操作的;字符串文字都将被自动嵌入。例如:

String s1 = "abc";    // Get a reference to the string defined by the literalString s2 = s1.intern();         // No-opSystem.out.println(s1 == s2);    // "true"System.out.println(s1 == "abc"); // "true", all literals are interned automatically

我也想知道我们是否使用new创建了一个String,那么实际上创建了多少个对象?

您至少创建一个

String
对象(新的,非intern的对象),并可能创建两个对象(如果文字尚未在池中;但是同样,在加载类文件的文字时,这会更早发生):

String s1 = "abc"; // Get a reference to the string defined by the literalString s2 = new String(s1);   // Create a new `String` object (guaranteed)System.out.println(s1 == s2); // "false"String s3 = s2.intern();      // Get the interned version of the string with these charactersSystem.out.println(s1 == s3); // "true"


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/446636.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号