【问题标题】:String memory allocation and string pool concepts字符串内存分配和字符串池概念
【发布时间】:2014-09-24 06:40:52
【问题描述】:

这两个分配在内存分配和字符串池方面有什么区别。

String b = "sunil" + "khokhar";

String a = "sunil";
String b = a + "khokhar";

【问题讨论】:

  • 你认为会发生什么?你认为编译器和字符串池会有什么不同?您是否考虑过使用 final 可能会产生什么影响?
  • 有什么关系。您想使用上述方法的实际需求是什么。

标签: java string memory-management string-pool


【解决方案1】:
String b = "sunil" + "khokhar";

"sunil""khokar" 都将被连接,b 的值将在编译时解析。因此,"sunilkhokhar 将出现在 字符串常量池 中。 和

String a = "sunil";
String b = a + "khokhar";

"sunil""khokar" 将是编译时常量(并被添加到字符串池中)。 但是b = a+"khokhar" 将使用StringBuilder 完成,并将在运行时发生。 因此,b 将出现在 heap 中,而不是出现在 String 常量池中。

【讨论】:

    【解决方案2】:

    String 是一个最终类,每次您使用“+”和“=”创建新对象时。对于变量赋值,如果值已经存在于池中,那么引用将与对象一起返回。

    【讨论】:

    • 不是每次。不,仅当您使用在连接期间不是最终的引用时。因此,如果afinal,则a + "khokhar" 将在编译期间解析。
    • 我认为在 String b="sunil"+"khokhar" 的情况下,只会创建一个对象,其值为 "sunilkhokhar",并且字符串池中有一个引用该对象的条目。
    • 并且如果是字符串 a = "sunil";字符串 b = a + "khokhar";创建了两个对象并引用了 2 个对象。@TheLostMind 如果有错误请纠正我
    • @SunilKhokhar - 3 个字符串对象。 “sunil”和“khokhar”将在字符串常量池中,而“sunilkhokhar”将在堆中。所以,总共 3 个。
    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多