String、StringBuilder和StringBuffer的区别

String、StringBuilder和StringBuffer的区别:

类名 是/否是可变类 是/否是线程安全 效率 使用环境 备注
String 不可变类(final修饰的类) 最低 单线程、操作的数据量比较少
StringBuffer 不可变类 是 (方法由synchronized修饰) 比String效率高 多线程、操作的数据量比较多 提供有修改内部数组的方法
StringBuilder 不可变类 最高 单线程、操作的数据量比较多 提供有修改内部数组的方法

不可变的对象具有非常多的优势,比如简单,安全等。但是,对于每一个不同的值,都需要该类的一个对象。而且,生成很多对象带来的问题就是可能导致频繁的垃圾回收。所以,在选择可变类还是不可变类时,应该综合考虑后再做抉择。

通常而言,可变对象可以避免创建大量的中间对象。一个非常经典的例子就是链接大量的短String对象为一个长的String对象。如果使用不可变String类,链接的过程将产生大量的、适合立即被垃圾回收的中间String对象,这将消耗大量的CPU性能和内存空间。此时,使用一个可变的StringBuilder或StringBuffer才是正确的。
除了上述情况,可变对象在其他场景下可能用于不可变对象。比如,传递一个可变的对象到方法内部,利用该对象可以收集多个结果,而不用在多个循环层次中跳进跳出。

String字符串在拼接的时候的首先会创建一个StringBuilder对象,其次调用StringBuilder的append()方法,最后调用StringBuilder的toString()方法返回给String变量,但是这样循环的时候会产生多个对象。
String、StringBuilder和StringBuffer的区别_第1张图片

public class TestDemo {
    public static void main(String[] args) {
       String str = "hello";
       for(int i = 0;i < 5;i++) {
            str = str+"world";
       }
    }
}

TestDemo反汇编:
String、StringBuilder和StringBuffer的区别_第2张图片

String各种不同写法及发生拼接时地址的位置

你可能感兴趣的:(java基础)