java学习日志–java中String对象与StringBuilder
java中的String对象是只能被读的,当你尝试使用s+= s1 ;时,总是会自动的创造一个StringBuilder对象,并且自动地调用append方法,来实现字符串的拼接 ,当然我们也可以手动地添加一个StringBuiler对象,那么这两种不同的方法有什么区别呢,看代码:
public class StringBuilderTest {
public static String implicit(String [] field ) {
String result = "implicit : ";
for(int i = 0 ; i < field.length ; i ++ ) {
result += field [i] + " " ;
}
return result ;
}
public static String explicit(String [] field) {
StringBuilder result = new StringBuilder("StringBuilder : ") ;
for(String s : field) {
result.append(s ) ;
result.append(" ") ;
}
return result.toString() ;
}
public static void main(String[] args) {
String s = "hello , java world" ;
String [] t = s.split(" ") ;
System.out.println(implicit(t)) ;
System.out.println(explicit(t)) ;
}
}
output:
C:\Users\26973\Desktop\java\chapter13\P284>java StringBuilderTest
implicit : hello , java world
StringBuilder : hello , java world
我们可以看到,首先,这两者都能正常地工作,我们使用javap -c来显示他们地汇编代码:
public static void main(java.lang.String[]);
Code:
0: ldc #10 // String hello , java world
2: astore_1
3: aload_1
4: ldc #6 // String
6: invokevirtual #11 // Method java/lang/String.split:(Ljava/lang/String;)[Ljava/lang/String;
9: astore_2
10: getstatic #12 // Field java/lang/System.out:Ljava/io/PrintStream;
13: aload_2
14: invokestatic #13 // Method implicit:([Ljava/lang/String;)Ljava/lang/String;
17: invokevirtual #14 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
20: getstatic #12 // Field java/lang/System.out:Ljava/io/PrintStream;
23: aload_2
24: invokestatic #15 // Method explicit:([Ljava/lang/String;)Ljava/lang/String;
27: invokevirtual #14 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
30: return
如果你熟悉汇编语言的话就能找到这两者的区别了:
自动使用StringBuilder对象地是方法,在每次为字符串添加字串时,都会自动生成一个StringBuilder对象,所有生成地StringBuilder对象个数等于for循环的次数 , 而你手动使用StringBuilder对象的时候,你只需要在for循环里面添加append语句就行了,所以手动使用StringBuilder对象,在你构造的String语句时需要使用循环的时候,花费的的代价要小得多。
conclusion: 当你的String对象相对复杂,需要使用循环来进行构造的话,尽量手动使用StringBuilder对象来实现吧。