1、用String定义出来的是字符串常量,不可以更改;StringBuffer,StringBuilder创建的是变量。
what?你在逗我?事实上是真的,只是我们没有看不见而已。
看见了吗?我可是改了a的值哟。其实通过网上查询最后发现这是Java虚拟机在背后搞事,在第七行它确实创建了一个对象str,也赋了值,但是第八行却不是重新给a赋值哦,jvm实际上是创建了一个新的对象,赋值bcd,而原来的str实际上是被jvm的回收机制给回收了而已。所以说用String定义的是常量。而StringBuffer,StringBuilder创建的是变量,即你可以动态的修改它的值,而不是创建或者会被jvm回收。
2、执行时间,速度上StringBuilder>StringBuffer>String,毕竟每次对String来说都是新创建一个对象还要进行回收,所以String操作字符串毫无疑问是最耗时间的,看下实例代码会更清楚。
package ali_different_sting.sty;
public class StringTest {
//测试
public static void StringTest(){
String str=null;//先定义一个产量
long start_time = System.currentTimeMillis();//获取下面操作前的时间
for(int i=0;i<1000;i++){//添加1000次字符串
str=str+"test";
}
long end_time = System.currentTimeMillis();//获取操作完成后的时间
long waste_time = end_time - start_time;//总过花费时间
System.out.println("用string花费时间:"+waste_time);
}
public static void StringBufferTest(){
StringBuffer str=new StringBuffer();//先定义一个产量
long start_time = System.currentTimeMillis();//获取下面操作前的时间
for(int i=0;i<1000;i++){//添加1000次字符串
str=str.append("test");
}
long end_time = System.currentTimeMillis();//获取操作完成后的时间
long waste_time = end_time - start_time;//总过花费时间
System.out.println("用StringBuffer花费时间:"+waste_time);
}
public static void StringBuilderTest(){
StringBuilder str=new StringBuilder();//先定义一个产量
long start_time = System.currentTimeMillis();//获取下面操作前的时间
for(int i=0;i<1000;i++){//添加1000次字符串
str=str.append("test");
}
long end_time = System.currentTimeMillis();//获取操作完成后的时间
long waste_time = end_time - start_time;//总过花费时间
System.out.println("用StringBuilder花费时间:"+waste_time);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "abc";
a = "bcd";
System.out.println(a);
StringTest();
StringBufferTest();
StringBuilderTest();
}
}
3、StringBuffer是线程安全的,因为它的很多方法都带有synchronized关键字,就是同步的意思。同步就是我做完之后你再做,比如有两个线程都要对字符串进行操作,如果设置了synchronized关键字,当有一个线程进行操作的时候就会将另一个线程阻塞。所以对应的StringBuilder就缺乏这个关键字,因此不是线程安全的。
总结就是:
- 字符串少的时候用String就够了速度也快;有大量字符串时用StringBuffer或者StringBuilder都行。
- String操作的是常量,对其的任何操作都会新建一个对象并且回收垃圾。StringBuffer,StringBuilder操作的是变量,可在原对象的基础上动态增长或者其他操作。
- 执行速度:StringBuilder>StringBuffer>String
- StringBuffer带有synchronized,线程安全;StringBuilder非线程安全。