String、StringBuilder和StringBuffer的区别:
类名 | 是/否是可变类 | 是/否是线程安全 | 效率 | 使用环境 |
---|---|---|---|---|
String | 不可变类(final修饰的类) | 否 | 最低 | 单线程、操作的数据量比较少 |
StringBuffer | 可变类 | 是 (方法由synchronized修饰) | 比String效率高 | 多线程、操作的数据量比较多 |
StringBuilder | 可变类 | 否 | 最高 | 单线程、操作的数据量比较多 |
不可变的对象具有非常多的优势,比如简单,安全等。但是,对于每一个不同的值,都需要该类的一个对象。而且,生成很多对象带来的问题就是可能导致频繁的垃圾回收。所以,在选择可变类还是不可变类时,应该综合考虑后再做抉择。
通常而言,可变对象可以避免创建大量的中间对象。一个非常经典的例子就是链接大量的短String对象为一个长的String对象。如果使用不可变String类,链接的过程将产生大量的、适合立即被垃圾回收的中间String对象,这将消耗大量的CPU性能和内存空间。此时,使用一个可变的StringBuilder或StringBuffer才是正确的。
除了上述情况,可变对象在其他场景下可能用于不可变对象。比如,传递一个可变的对象到方法内部,利用该对象可以收集多个结果,而不用在多个循环层次中跳进跳出。
String字符串在拼接的时候的首先会创建一个StringBuilder对象,其次调用StringBuilder的append()方法,最后调用StringBuilder的toString()方法返回给String变量,但是这样循环的时候会产生多个对象。
public class TestDemo {
public static void main(String[] args) {
String str = "hello";
for(int i = 0;i < 5;i++) {
str = str+"world";
}
}
}
TestDemo反汇编: