首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中创建了多少String对象?

在Java中创建了多少String对象?
EN

Stack Overflow用户
提问于 2016-02-15 16:57:22
回答 2查看 160关注 0票数 2

我有以下Java代码:

代码语言:javascript
复制
String a = "Java" + "Virtual" + "Machine";

为某人创建了5个对象( "Java“," Virtual ","Machine","Java Virtual",”Java Virtual Machine")。

但我知道这段代码等于:

代码语言:javascript
复制
String a = new StringBuilder("Java").append("Virtual").append("Machine").toString();

这里没有一个物体吗?

创建了多少String对象?

编辑:

下面的代码也有同样的问题:

代码语言:javascript
复制
String a = "Java";
String b = "Virtual";
String c = a + b + "Machine";

创建了多少String对象?

EN

回答 2

Stack Overflow用户

发布于 2016-02-15 17:04:03

只要创建一个string对象,编译器就会将String a = "Java" + "Virtual" + "Machine";优化为String a = "JavaVirtualMachine";

这似乎与javap -c Test的输出类似,我使用了一个System.out.println来防止编译器完全优化它:

代码语言:javascript
复制
Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String...);
    Code:
       0: ldc           #2                  // String JavaVirtualMachine
       2: astore_1
       3: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       6: aload_1
       7: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      10: return
}
票数 2
EN

Stack Overflow用户

发布于 2016-02-15 17:02:13

编译器将对代码进行优化,使其与以下值相等:

代码语言:javascript
复制
String a = "JavaVirtualMachine";

更有趣的问题可能是它做了什么:

代码语言:javascript
复制
int x = 5;
String a = "foo" + x + "bar";

在这种情况下,编译器将创建一个StringBuilder并附加所有值。这将大致转换为以下代码:

代码语言:javascript
复制
int x = 5;
String a = new StringBuilder().append("foo").append(x).append("bar").toString();

但是,如果您在循环中连接String,编译器将在每次迭代中创建一个StringBuilder。所以如果你有这样的代码:

代码语言:javascript
复制
String[] errorMessages = getErrorMessages();
String output = "Found the following error messages:";
for(int i = 0; i < errorMessages.length(); i++){
    output += "\n" + (i+1) + ": " + errorMessages[i];
}

这将(同样粗略地)翻译为:

代码语言:javascript
复制
String[] errorMessages = getErrorMessages();
String output = "Found the following error messages:";
for(int i = 0; i < errorMessages.length(); 
    output = new StringBuilder(output).append('\n')
            .append((i+1)).append(": ").append(errorMessages[i]).toString();
}

如前所述,这将在每次迭代中创建一个新的StringBuilder。因此,在这些情况下,最好不要依赖编译器来实现它的魔力,而是创建自己的StringBuilder,并在整个迭代过程中使用相同的对象:

代码语言:javascript
复制
String[] errorMessages = getErrorMessages();
StringBuilder builder = new StringBuilder("Found the following error messages:");
for(int i = 0; i < errorMessages.length(); i++){
    builder.append('\n').append((i+1)).append(": ").append(errorMessages[i]);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35405054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档