How many objects are created

后端 未结 4 1384
栀梦
栀梦 2020-12-02 00:15

I was having a discussion about usage of Strings and StringBuffers in Java. How many objects are created in each of these two examples?

Ex

4条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-02 01:06

    You can determine the answer by analyzing the java bytecode (use javap -c). Example 1 creates two StringBuilder objects (see line #4) and two String objects (see line #7), while example 2 creates one StringBuilder object (see line #2).

    Note that you must also take the char[] objects into account (since arrays are objects in Java). String and StringBuilder objects are both implemented using an underlying char[]. Thus, example 1 creates eight objects and example 2 creates two objects.

    Example 1:

    public static void main(java.lang.String[]);
      Code:
       0:   ldc             #2; //String a
       2:   astore_1
       3:   new             #3; //class java/lang/StringBuilder
       6:   dup
       7:   invokespecial   #4; //Method java/lang/StringBuilder."":()V
       10:  aload_1
       11:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       14:  ldc             #6; //String b
       16:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       19:  invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
       22:  astore_1
       23:  new             #3; //class java/lang/StringBuilder
       26:  dup
       27:  invokespecial   #4; //Method java/lang/StringBuilder."":()V
       30:  aload_1
       31:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       34:  ldc             #8; //String c
       36:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       39:  invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
       42:  astore_1
       43:  return   
    }
    

    Example 2:

    public static void main(java.lang.String[]);
      Code:
       0:   new             #2; //class java/lang/StringBuilder
       3:   dup
       4:   ldc             #3; //String a
       6:   invokespecial   #4; //Method java/lang/StringBuilder."":(Ljava/lang/String;)V
       9:   astore_1
       10:  aload_1
       11:  ldc             #5; //String b
       13:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       16:  pop
       17:  aload_1
       18:  ldc             #7; //String c
       20:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       23:  pop
       24:  return  
    }
    

提交回复
热议问题