当前位置: 首页 > 面试题库 >

Java中的串联字符串是否总是导致在内存中创建新字符串?

燕禄
2023-03-14
问题内容

我的长字符串不适合屏幕的宽度。例如。

String longString = "This string is very long. It does not fit the width of the screen. So you have to scroll horizontally to read the whole string. This is very inconvenient indeed.";

为了使阅读更容易,我想到了用这种方式编写它-

String longString = "This string is very long." + 
                    "It does not fit the width of the screen." +
                    "So you have to scroll horizontally" +
                    "to read the whole string." +
                    "This is very inconvenient indeed.";

但是,我意识到第二种方法使用字符串连接,并会在内存中创建5个新字符串,这可能会导致性能下降。是这样吗
还是编译器足够聪明,以至于我只需要一个字符串就可以了?我如何避免这样做?


问题答案:

我意识到第二种方法使用字符串连接,并将在内存中创建5个新字符串,这可能会导致性能下降。

不,不会。由于这些是字符串文字,因此将在编译时对其进行求值,并且 只会 创建 一个字符串
。这是在Java语言规范#3.10.5中定义的:

可以使用字符串连接运算符+
[…] 将长字符串文字始终分解成较短的片段并写为(可能带有括号)表达式,
而且,字符串文字始终始终引用String类的相同实例。

  • 由常量表达式(第15.28节)计算出的字符串在编译时进行计算,然后将其视为文字。
  • 在运行时通过串联计算的字符串是新创建的,因此是不同的。

测试:

public static void main(String[] args) throws Exception {
    String longString = "This string is very long.";
    String other = "This string" + " is " + "very long.";

    System.out.println(longString == other); //prints true
}

但是,下面的情况有所不同,因为它使用了一个变量-现在有一个串联并创建了多个字符串:

public static void main(String[] args) throws Exception {
    String longString = "This string is very long.";
    String is = " is ";
    String other = "This string" + is + "very long.";

    System.out.println(longString == other); //prints false
}


 类似资料:
  • 当使用文字创建字符串时,它会存储在池中。但当使用new运算符创建字符串对象时,它会将对象存储在堆中。 但是,堆中的对象只是一个指向存储在池中的文本的指针,还是一个存储在堆中的简单字符串对象,符合GC的条件?

  • 根据Java, 字符串存储在两个地方。字符串字面池和堆内存根据其创建。我需要知道,当字符串赋值到另一个字符串时,新创建的字符串将存储在哪里? 我对堆和字符串池中的字符串类型都进行了赋值操作。我得到了这样的结果。 但是当, 如果我这么做 同样地, 现在 以上是我在IDE上得到的输出。根据该输出,strNew的一个新引用对象在字符串池中创建,strNew的一个新引用对象在堆中创建。对吗?

  • 问题内容: 如何检查是否是那里的? 我想分配给是否有结果,否则。 我当前的代码是: 问题答案:

  • 使用此代码创建了多少个对象?-我知道3个字符串文本在字符串常量池中,StringBuilder对象在堆中,但当我调用reverse()、insert()或append()时,它会在池中创建一个新字符串吗?

  • 考虑以下键(under_score)和字段(lowerCamel): 我正在Java中寻找一种有效的方法来检查是否在中,我希望以下返回: 我的代码: 我可以用下划线替换所有小写,但我正在寻找更有效的方法。

  • 我想知道字符串是否是一个精确的单词,但例如,如果我这样做: 它返回true,但我希望你给我返回false,因为在变量中,单词而不是的单词。我如何继续?