Let's take a look at the connection between two simple strings.Code
1 Public Class Test {
2 Public Static String testjoinstring (){
3 String STR = "A" + "";
4 Return STR;
5 }
6
7 Public Static String testjomongoingbuffer (){
8 Stringbuffer sb = New Stringbuffer ();
9 SB. append ("");
10 SB. append ("");
11 Return SB. tostring ();
12 }
13 }
After compilation
Javap-verbose test> test.txtDecompile bytecodeJavaIntermediate code. Directly look at the subject.
--------------------------------------------
Public static java. Lang. String testjoinstring ();
Code:
Stack = 1, locals = 1, args_size = 0
0: LDC #16; // string AA
2: astore_0
3: aload_0
4: areturn
Public static java. Lang. String testjoinstringbuffer ();
Code:
Stack = 2, locals = 1, args_size = 0
0: New #21; // class Java/lang/stringbuffer
3: DUP
4: invokespecial #23; // method Java/lang/stringbuffer. "<init>" :() V
7: astore_0
8: aload_0
9: LDC #24; // string
11: invokevirtual #26; // method Java/lang/stringbuffer. append :( ljava/lang/string;) ljava/lang/stringbuffer;
14: Pop
15: aload_0
16: LDC #24; // string
18: invokevirtual #26; // method Java/lang/stringbuffer. append :( ljava/lang/string;) ljava/lang/stringbuffer;
21: Pop
22: aload_0
23: invokevirtual #30; // method Java/lang/stringbuffer. tostring :() ljava/lang/string;
26: areturn
--------------------------------------------
Look at the red part
StringConnection:
0: LDC #16; // string AA,
We can see that during compilation, expressions have been directly merged and optimized, So we loaded them directly.AA
StringbufferIn the case:
9: LDC #24; // string
16: LDC #24; // string
Loaded twice
From the above we can see that in the case of a few simple strings and strings that do not involve variables. The string + number connection has been optimized during compilation, so the efficiency is higher than that of stringbuffer.
Next let's take a look at how simple strings are connected to variables.
1 Public Class Test1 {
2 Public Static String testjoinstring (){
3 String str1 = "";
4 String str2 = "A" + str1;
5 Return Str2;
6 }
7 Public Static String testjomongoingbuffer (){
8 Stringbuffer sb = New Stringbuffer ();
9 SB. append ("");
10 SB. append ("");
11 Return SB. tostring ();
12 }
13 }
Similarly, in cmdJavap-verbose test1> test1.txt
View subject
--------------------------------------------
Public static java. Lang. String testjoinstring ();
Code:
Stack = 3, locals = 2, args_size = 0
0: LDC #16; // string
2: astore_0
3: New #18; // class Java/lang/stringbuilder
6: DUP
7: LDC #16; // string
9: invokespecial #20; // method Java/lang/stringbuilder. "<init>" :( ljava/lang/string;) V
12: aload_0
13: invokevirtual #23; // method Java/lang/stringbuilder. append :( ljava/lang/string;) ljava/lang/stringbuilder;
16: invokevirtual #27; // method Java/lang/stringbuilder. tostring :() ljava/lang/string;
19: astore_1
20: aload_1
21: areturn
--------------------------------------------
StringbufferSome code is not changed to space saving. It is not listed here. You can take a look at it.
Check the red part again.
StringOf+Number connection
0: LDC #16; // string
7: LDC #16; // string
13: invokevirtual #23;
// Method Java/lang/stringbuilder. append :( ljava/lang/string;) ljava/lang/stringbuilder;
We can see thatStringOf+Number connection, still calledStringbuffer. appendMethod.
Therefore, when a few simple strings are connected to variables, the efficiency of the two is basically the same.
Next let's look at the last situation. Code connecting a large number of strings and variables
1 Public Class Test2 {
2 Public Static String testjoinstring (){
3 String STR = "";
4 For ( Int I = 0; I <100; I ++ ){
5 STR + = "A" + I;
6 }
7 Return STR;
8 }
9
10 Public Static String testjomongoingbuffer (){
11 Stringbuffer sb = New Stringbuffer ();
12 For ( Int I = 0; I <100; I ++ ){
13 SB. append ("");
14 SB. append (I );
15 }
16 Return SB. tostring ();
17 }
18 }
Javap-verbose Test2> test2.txt
Subject
--------------------------------------------
Public static java. Lang. String testjoinstring ();
Code:
Stack = 3, locals = 2, args_size = 0
0: LDC #16; // string
2: astore_0
3: iconst_0
4: istore_1
5: goto 35
8: New #18; // class Java/lang/stringbuilder
11: DUP
12: aload_0
13: invokestatic #20;
// Method Java/lang/string. valueof :( ljava/lang/object;) ljava/lang/string;
16: invokespecial #26; // method Java/lang/stringbuilder. "<init>" :( ljava/lang/string;) V
19: LDC #16; // string
21: invokevirtual #29;
// Method Java/lang/stringbuilder. append :( ljava/lang/string;) ljava/lang/stringbuilder;
24: iload_1
25: invokevirtual #33;
// Method Java/lang/stringbuilder. append :( I) ljava/lang/stringbuilder;
28: invokevirtual #36; // method Java/lang/stringbuilder. tostring :() ljava/lang/string;
31: astore_0
32: iinc 1, 1
35: iload_1
36: bipush 100
38: if_icmplt 8
41: aload_0
42: areturn
Public static java. Lang. String testjoinstringbuffer ();
Code:
Stack = 2, locals = 2, args_size = 0
0: New #45; // class Java/lang/stringbuffer
3: DUP
4: invokespecial #47; // method Java/lang/stringbuffer. "<init>" :() V
7: astore_0
8: iconst_0
9: istore_1
10: goto 29
13: aload_0
14: LDC #16; // string
16: invokevirtual #48;
// Method Java/lang/stringbuffer. append :( ljava/lang/string;) ljava/lang/stringbuffer;
19: Pop
20: aload_0
21: iload_1
22: invokevirtual #51; // method Java/lang/stringbuffer. append :( I) ljava/lang/stringbuffer;
25: Pop
26: iinc 1, 1
29: iload_1
30: bipush 100
32: if_icmplt 13
35: aload_0
36: invokevirtual #54; // method Java/lang/stringbuffer. tostring :() ljava/lang/string;
39: areturn
------------------------------------------
Look at the red part above.(Subject)
Testjoinstring
5: goto 35
8: New #18; // class Java/lang/stringbuilder
19: LDC #16; // string
21: invokevirtual #29;
// Method Java/lang/stringbuilder. append :( ljava/lang/string;) ljava/lang/stringbuilder;
25: invokevirtual #33;
// Method Java/lang/stringbuilder. append :( I) ljava/lang/stringbuilder;
28: invokevirtual #36; // method Java/lang/stringbuilder. tostring :() ljava/lang/string;
36: bipush 100
38: if_icmplt 8
Testjoinstringbuffer
0: New #45; // class Java/lang/stringbuffer
13: aload_0
14: LDC #16; // string
16: invokevirtual #48;
// Method Java/lang/stringbuffer. append :( ljava/lang/string;) ljava/lang/stringbuffer;
22: invokevirtual #51; // method Java/lang/stringbuffer. append :( I) ljava/lang/stringbuffer;
30: bipush 100
32: if_icmplt 13
We can see from the above. String Of + Number connection , Inside the loop body (8 ~ 28) , Every time New One Stringbuffer Come out, and Stringbuffer. append Method, only in vitro, New One Stringbuffer .
In this case, if the cycle is large,StringOf+Number connection is quite resource-consuming and time-consuming.
Therefore, in the case of a large number of connections.StringbufferThe efficiency is significantly higherStringOf+Connection