一、本质区别
1.String 修改的内容不可改变
1.1 String 类不可继承
1.2 String 修饰的内容不可变
2.StringBuffer / StringBuilder 修饰的内容可变更
二、运行速度
解释:
StringBuilder StringBuffer 减少开辟堆空间的时间,只需new一次,而StringBuffer 线程安全,synchronized 的同时需要消耗时间。
String 常量池的因素,所以在拼接短的字符串,拼接final常量,速度要高于StringBuilder
1.大量字符操作
StringBuilder > StringBuffer > String
使用场景:
[list]
[*]在循环中拼接字符串,使用StringBuilder,只需new一次;而String 每执行一次循环,new一次
[*]
[/list]
2.少量字符操作
String > StringBuilder > StringBuffer
使用场景:
[list]
[*]拼接常量
[/list]
三、线程安全
StringBuffer 线程安全
String 内容不可变,线程安全
StringBuilder 线程不安全
继承同一个父类,在实现上,前者使用了 synchronized 修饰
1.String 修改的内容不可改变
1.1 String 类不可继承
// final 修饰的类不可继承
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
1.2 String 修饰的内容不可变
/** The value is used for character storage. */
private final char value[];
2.StringBuffer / StringBuilder 修饰的内容可变更
// 类不可继承
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
// 类不可继承
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
// 两者具有相同的抽象父类
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
// 内容可变
char value[];
}
二、运行速度
解释:
StringBuilder StringBuffer 减少开辟堆空间的时间,只需new一次,而StringBuffer 线程安全,synchronized 的同时需要消耗时间。
String 常量池的因素,所以在拼接短的字符串,拼接final常量,速度要高于StringBuilder
1.大量字符操作
StringBuilder > StringBuffer > String
使用场景:
[list]
[*]在循环中拼接字符串,使用StringBuilder,只需new一次;而String 每执行一次循环,new一次
[*]
[/list]
2.少量字符操作
String > StringBuilder > StringBuffer
使用场景:
[list]
[*]拼接常量
[/list]
三、线程安全
StringBuffer 线程安全
String 内容不可变,线程安全
StringBuilder 线程不安全
继承同一个父类,在实现上,前者使用了 synchronized 修饰