在下面的代码中创建的String对象总数?

时间:2016-12-07 08:14:43

标签: java string

public static void main(String[] args) {
        String a = new String("abc");
        String b = "abc";
        String c = "abc" + "KDF" + "gh" +"rt" +"jk";

    }

请在下面找到代码的字节代码。

Compiled from "NumOfStringObject.java"
public class com.practise.general.NumOfStringObject extends java.lang.Object{
public com.practise.general.NumOfStringObject();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   new     #2; //class java/lang/String
   3:   dup
   4:   ldc     #3; //String abc
   6:   invokespecial   #4; //Method java/lang/String."<init>":(Ljava/lang/Strin
g;)V
   9:   astore_1
   10:  ldc     #3; //String abc
   12:  astore_2
   13:  ldc     #5; //String abcKDFghrtjk
   15:  astore_3
   16:  return

}

我没有阅读/理解字节代码的经验,我想总共创建了3个String对象。

让我知道你的想法。

3 个答案:

答案 0 :(得分:4)

是的,三个。乍一看,你想的更多,但编译器将结合字符串常量; details in JLS§15.28 - Constant Expressions。因此,编译器有效地将main的正文视为:

String a = new String("abc");
String b = "abc";
String c = "abcKDFghrtjk";

它还为类中的等效常量重用了相同的字符串(interned,因此同一个字符串也可用于各个类),这意味着只有一个{{1}由该代码中"abc"字面值的两次出现创建。

所以:

  • 来自常量(文字)
  • 的一个"abc"
  • 来自另一个常量的一个"abc"(组合多个文字的结果)
  • 您通过"abcKDFghrtjk"
  • 在第一行代码中明确创建的一个"abc"作为单独的对象

答案 1 :(得分:2)

  1. 文字"abc"已创建。
  2. 创建与"abc"具有相同字符的字符串。
  3. 文字"abcKDFghrtjk"已创建。
  4. Specification

    "This is a string"    // a string containing 16 characters
    "This is a " +        // actually a string-valued constant expression,
        "two-line string"    // formed from two string literals
    
      

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

答案 2 :(得分:-4)

字符串不可变

阅读此处的讨论。应该帮助你。 String is immutable. What exactly is the meaning?

简而言之。 如果您见过String变量在代码中更改其值,则可以安全地假设已创建新对象

String s = new String("some value"); 

String s = "some value"; 

非常相同。当您使用=时,未设置该值,但实际上在同一参考s下创建了一个新对象

编辑: 对于“Downvoters”,答案是 YES 创建了三个对象