How many objects are created

I discussed the use Stringand StringBufferin Java. How many objects are created in each of these two examples?

Example 1:

String s = "a";
s = s + "b";
s = s + "c";        

Example 2:

StringBuilder sb = new StringBuilder("a");
sb.append("b");
sb.append("c");

In my opinion, Ex 1 will create 5, and Ex 2 will create 4 objects.

+5
source share
4 answers

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

, char[] ( Java). String StringBuilder char[]. , 1 , 2 .

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."<init>":()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."<init>":()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   
}

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."<init>":(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  
}
+4

:

1 8 :

String s = "a"; // No object created
s = s + "b"; // 1 StringBuilder/StringBuffer + 1 String + 2 char[] (1 for SB and 1 for String)
s = s + "c"; // 1 StringBuilder/StringBuffer + 1 String + 2 char[] (1 for SB and 1 for String)

2 2 :

StringBuffer sb = new StringBuffer("a"); // 1 StringBuffer + 1 char[] (in SB)
sb.append("b"); // 0
sb.append("c"); // 0

, , char [] Java ( , ). aix .

+5

, .

8 :

String s = "a";
s = s + "b";
s = s + "c";
  • String;
  • StringBuilder;
  • char[].

, :

StringBuffer sb = new StringBuffer("a");
sb.append("b");
sb.append("c");

2 :

  • StringBuilder;
  • char[].

JDK 1.6u30.

P.S. , , , sb.toString() .

+5

( ). . , , (, , JLS ). . ,

Ex1 1 ( , String s= "abc" ;). , 8 ( , ).

Ex2 2. , StringBuilder , . 6, StringBuilder , char[] , .

-1

All Articles