一、三者的主要区别
String: 不可变字符串,初始值可以为null,线程不安全,运行速度最慢;
StringBuilder: 可变字符串,初始值不能为null,线程不安全,运行速度最快
StringBuffer: 可变字符串,初始值不能为null,线程安全,运行速度比StringBuilder慢一点点;
二、详细解释
String变量是不可变量,每次对对象的值的修改实际上都是改变对象指向不同的堆内存。比如String str = new String(“hello”); str = str + “world”,事实上创建了三个String变量,new String()的时候创建了“hello”,在执行第二条语句的时候首先创建第二个"world",最后再创建“helloworld”变量,最终str对象指向“helloworld”。因此,String在需要做大量修改的时候就会变得效率低下。
StringBuilder是可变字符串,每一次的修改在都是在自身直接改动,并不会创建新的变量,因此效率很高,并且占用的堆内存很少,在不需要保证线程安全的场景中应该使用StringBuilder.
StringBuffer修改时与StringBuilder一样都是在自身直接修改,但是StringBuffer保证了线性安全,因此,效率相对于StringBuilder有所不如,但是在必须保证线程安全的情况下应该使用StringBuffer.