What is the difference in converting a string buffer to a string using .toString (), String.valueOf () and + ""

What is the main difference between converting StringBuffer to String for the following three cases:

Case 1: Using toString ()

StringBuffer sb = new StringBuffer("Welcome"); String st = sb.toString(); 

Case 2: Use + ""

 StringBuffer sb = new StringBuffer("Welcome"); String st = sb + ""; 

Case 3: Using String.valueOf ()

 StringBuffer sb = new StringBuffer("Welcome"); String st = String.valueOf(sb); 

What is best used in performance?

+7
java string stringbuilder
source share
2 answers

it

 StringBuffer sb = new StringBuffer("Welcome"); String st = sb + ""; 

will result in more or less in

 StringBuffer sb = new StringBuffer("Welcome"); StringBuilder builder = new StringBuilder(); builder.append((sb == null) ? "null" : sb.toString()); builder.append(""); String st = builder.toString(); 
+8
source share

If we compile them into two methods in java

 private StringBuffer sb = new StringBuffer("Welcome"); public String testToString() { return sb.toString(); } public String testAppend() { return sb + ""; } 

and then use javap -v , we get

 public java.lang.String testToString(); descriptor: ()Ljava/lang/String; flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: getfield #19 // Field sb:Ljava/lang/StringBuffer; 4: invokevirtual #27 // Method java/lang/StringBuffer.toString:()Ljava/lang/String; 7: areturn LineNumberTable: line 10: 0 LocalVariableTable: Start Length Slot Name Signature 0 8 0 this Lcom/stackoverflow/Question; public java.lang.String testAppend(); descriptor: ()Ljava/lang/String; flags: ACC_PUBLIC Code: stack=2, locals=1, args_size=1 0: new #31 // class java/lang/StringBuilder 3: dup 4: invokespecial #33 // Method java/lang/StringBuilder."<init>":()V 7: aload_0 8: getfield #19 // Field sb:Ljava/lang/StringBuffer; 11: invokevirtual #34 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; 14: invokevirtual #38 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 17: areturn LineNumberTable: line 14: 0 LocalVariableTable: Start Length Slot Name Signature 0 18 0 this Lcom/stackoverflow/Question; 

Thus, adding looks a little less efficient since it uses an extra bit of the stack and contains more instructions.

+3
source share

All Articles