1.String
首先要知道final相关:
1.final修饰类:代表这个类不能被继承
2.final修饰变量:如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
String的底层是字符数组,由于
1.字符数组被final和private修饰,且String类没有提供(暴露)修改字符数组的方法
2…String类被final修饰,不可被继承,从而避免了子类更改String
所以String的长度是不可变的,并且是线程安全的
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
2.StirngBuffer
StringBuffer继承自AbstractStringBuilder,在 AbstractStringBuilder 中也是使用字符数组保存字符串的, 但是字符数组没有被 final 和private修饰,并且还提供了append()方法,所以StirngBuffer长度是可变的
由于StringBuffer的append方法被synchronized修饰,所以StringBuffer是线程安全的
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
3.StringBuilder
StringBuilder也是继承自AbstractStringBuilder,AbstractStringBuilder 中也是使用字符数组保存字符串的, 但是字符数组没有被 final 和private修饰,并且还提供了append()方法,所以StringBuilder长度是可变的。
由于StringBuilder的append方法没有被synchronized修饰,所以StringBuilder不是线程安全的
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
注意:StringBuffer线程安全,StringBuilder线程不安全,别搞反了
在效率方面:因为StringBuffer很多方法都被synchronized修饰,同时刻只能有一个线程去执行一个方法,所以效率会比StringBuilder低一些
总结:
1.可变性: String长度不可变,StringBuffer和StringBuilder长度可变
2.安全性: String线程安全,StringBuffer线程安全,StringBuilder线程不安全
3.效率:StringBuffer效率低于StringBuilder