String、StringBuilder、StringBuffer的区别
String、StringBuilder、StringBuffer都可以用来操作字符串,但三者适用的范围、操作的速度均有所区别。
执行速度:
StringBuilder > StringBuffer > String
1、String对象拼接时,如String a = "a", b = "b", c = "c"; 拼接时a = a + b;重新新建对象a,然后将a的值加上b,并把值赋给a。因为涉及到新的对象创建和旧对象的回收,所以操作速度较慢;
2、StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多;
3、StringBuilder是线程不安全的,适合在单线程中操作,速度快,而StringBuffer是线程安全的(多个方法中有同步锁synchronized),适合多线程的并发,因此
String是字符串常量,当对String字符串进行操作时,会有新的对象的创建和旧对象的回收,
即:String str = "123";
Systom.out.println(str);
str = str + "456";
Systom.out.println(str);
在以上操作中,两次的输出分别是“123”、“123456”,这其中并不是直接更改了str的值,
具体的处理是:
1、创建一个对象str,并赋值"123";
2、在str = str + "456"中,JVM会在创建一个新的对象str,然后原来的str值"123"和"456"相加,得到”123456“;
3、新值"123456",会赋给新的str,旧有的str对象则会被收回。
在以上操作中,旧的str对象创建后就不可以再度更改了,看似是更改的str,其实是新的对象呗创建了
注:
1) String str1 = "123"; String str2 = "456"; String str = str1 + str2;这里的str中就会有对象的创建和回收了
2) String str = "123" + "456";和String str = "123456";这两个操作一样,仅有一个对象的创建操作,不涉及对象的回收操作,速度和StringBuilder的append()的操作一样;
所以,涉及到String对象的新建、回收时,必须有一个以上的String对象和字符串进行操作,并且String的操作是线程不安全的。
StringBuffer和StringBuilder是对象的操作,值的修改等操作是直接在变量上进行修改,所以这两者的操作速度相较String快些。
而StringBuffer中,方法append()、write()等方法中均有synchronized修饰,可以保证线程间的资源安全;而StringBuilder则并没有这种,因此StringBuilder速度比较StringBuffer快,
所以,StringBuilder最快,适合在单线程中大量字符串操作; StringBuffer次之,适合在多线程中大量字符串操作,线程安全; String最慢,适合少量字符串的操作。