【问题标题】:How many String objects will be created in String s="abc"+"xyz"; in prior versions of Java 1.5?String s="abc"+"xyz" 中会创建多少个String对象;在 Java 1.5 的早期版本中?
【发布时间】:2014-05-07 19:29:40
【问题描述】:

根据这个link,在Java 1.5 及以后的代码String s="abc"+"xyz"; 中,由于使用StringBuilder 类进行编译器优化,只创建了一个对象。

new StringBuilder().append(abc).append(xyz).toString()

那么这是否意味着在 java 1.5 String 之前用于创建三个对象一个“abc”,另一个“xyz”和第三个“abcxyz”或者然后它使用其他一些类如 StringBuffer 进行类似的编译器优化?

【问题讨论】:

    标签: java string


    【解决方案1】:

    不,据我所知 一直 被视为编译时常量,并且一直等价于

    String s = "abcxyz";
    

    请注意,Java 1.5 引入了StringBuilder;在执行时字符串连接之前使用StringBuffer

    first edition of the JLS,关键句已经存在:

    字符串字面量 - 或更一般地,作为常量表达式值的字符串(第 15.27 节) 是“内部的”,以便使用 String.intern 方法(第 20.12 节)共享唯一实例.47)。

    (并且第 15.27 节包括字符串连接。)

    【讨论】:

      【解决方案2】:

      代码

      String s="abc"+"xyz";
      

      在编译时创建一个字符串文字。 Java 一直都是这样做的。它在 Java 5.0 中没有改变。

      改变的是,如果你有这样的代码

      String abc = "abc";
      String s = abc + "xyz";
      

      在 Java 1.0 到 1.4 中,它使用 StringBuffer 来执行此操作。它在 Java 5.0 中被 StringBuilder 取代,因为如果您不需要线程安全并且在 99.9% 的情况下不需要线程安全,它会更有效。

      【讨论】:

      • (并且在 100% 的情况下,在这样的表达式中发生连接的情况下,您不会。)
      • @DavidConrad 比这稍差一点的是,StringBuffer 仅对一个操作来说是线程安全的。多次调用需要您在外部锁定缓冲区。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 2012-02-26
      相关资源
      最近更新 更多