1.从运行速度上面来说,string<Stringbuffer<Stringbuilder;
String为字符串常量;而其他两者为字符串变量;
例如程序:
String str=abc;
System.out.println(str);
str=str+"de";
System.out.println(str);
通过输出你会发现,第一个str为abc,第二次输出为abcde;第一眼看上去好像str的值改变,但是你看到的是假象(眼见也不一定是真的),这涉及到java的回收机制,前面提到String数据一旦确定就不能更改,在第三行中其实是java虚拟机给你新new了一个对象,相当于重新创建了一个str。而原来的str被Java虚拟机的回收机制给回收了。
而为什么我说另外两种比string快呢,因为这两种是直接对对象2进行更改的,而并不需要new一个对象 ,也不必对之前对象进行回收。(为什么说Stringbuilder比Stringbuffer快呢,就要涉及到线程安全性的问题了);
2,从线程安全性上面来说;
String不必多说。由于是常量,被(final)修饰,一旦创建无法更改,所以搁置一边,自然安全。
Stringbuffer使用了synchronized等关键字,保证了是安全的,但是这种安全是以牺牲一部分性能换取的,所以说解决了上面的问题。
Strinbilder是不安全的,没有保护,只适用于单线程。
3关于适用范围。
String 适用于字符串少更改的情况。
Stringbuffer适用于多线程(因为安全)
Stringblider适用于多更改的单线程