String对象是字符串常量,不可变的,底层是用final修饰的,public final class String。
我们经常做的字符串+运算,这样是一种不可取的做法,因为String的对象是常量。
比如String s = "123",s=s+"45",它不是在原来的s上做的操作,而是又重新创建了个对象,赋值给他,GC(垃圾回收机制)在把原来的对象回收,这样是非常消耗内存和时间的,不建议使用。
StringBuffer对象是字符串变量,可变,作的操作都是在原先对象的基础上进行的,相比String会好很多。
比如StringBuffer s = new StringBuffer().append("123"),s.append("45"),执行完这两行代码,只创建了一个对象s。
StringBuilder对象是字符串变量,可变,和StringBuffer都是在原先得对象上进行相应的操作。
区别:
(1)String-->字符串变量,StringBuffer和StringBuilder-->字符串变量
(2)String-->适用于少量的字符串操作,StringBuffer-->适用于在多线程下,在字符串缓冲区进行大量的字符串操作,StringBuilder-->适用于单线程下在字符串缓冲区进行大量操作
(3)String和StringBuilder线程不安全,StringBuffer线程安全,方法几乎都使用了锁机制
(4)执行速度String最慢,其次是StringBuffer,最快的是StringBuilder,StringBuffer和StringBuilder相差较少
测试:
/** * @Author:Alex_lei * @Description: Test (String,StringBuilder,StringBuffer) speed */ public class StringBuffer_Builder { public static void main(String[] args) { long start = System.currentTimeMillis(); String str = ""; for(int i=0;i<10000;i++){ str=str+"a"; } long stop = System.currentTimeMillis(); System.out.println(stop-start); start = System.currentTimeMillis(); StringBuilder stringBuilder = new StringBuilder(); for(int i=0;i<10000;i++){ stringBuilder.append("a"); } stop = System.currentTimeMillis(); System.out.println(stop-start); start = System.currentTimeMillis(); StringBuffer stringBuffer = new StringBuffer(); for(int i=0;i<10000;i++){ stringBuffer.append("a"); } stop = System.currentTimeMillis(); System.out.println(stop-start); } }
结果:
138 -->String
0 -->StringBuilder
1 -->StringBuffer