都是java.lang包下
String
implements java.io.Serializable, Comparable<String>, CharSequence 占用资源多
1. 值(长度和内容)不变(常量) private final char value[]; 但引用可变 利用反射可以修改常量池中的常量(value数组)
2. 构造方法:无参、字符串常量、字符数组、字符数组的一部分、整数数组的一部分、字节数组、字节数组的一部分、StringBuffer对象、StringBuilder对象等
3. 功能:判断、获取、转换、替换、去空格、按字典序比较 NOTE:基本上返回的是新串
StringBuffer
extends AbstractStringBuilder implements java.io.Serializable, CharSequence 占用资源少
1. 值(长度和内容)可变 private transient char[] toStringCache;//不被序列化
2. 构造方法:无参(初始大小为16),带参(指定大小),字符串(大小为字符串长度+16)
3. 功能:添加(任意类型),删除(也可指定位置),替换,反转,NOTE:原StringBuffer串上做调整修改
截取(返回的是新字符串)
4. 同步,线程安全,效率低
为什么StringBuffer线程安全?因为其所有的public方法都是synchronized修饰的!
5. 缓冲区
private transient char[] toStringCache;
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}
缓冲区对StringBuffer的优化:直接使用toStringCache构造一个新的字符串
6. 适用场景:多线程
StringBuilder
extends AbstractStringBuilder implements java.io.Serializable, CharSequence 占用资源少
1. 值(长度和内容)可变 没有缓冲字符数组!!!
2. 构造方法:无参(初始大小为16),带参(指定大小),字符串(大小为字符串长度+16)
3. 功能:添加(任意类型),删除(也可指定位置),替换,反转,NOTE:原StringBuffer串上做调整修改
没有截取!!!
4. 非同步,线程不安全,效率高
为什么StringBuffer线程不安全?因为其方法没有加同步锁!
5. 缓冲区
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
public String(char value[], int offset, int count) {
if (offset < 0) {
throw new StringIndexOutOfBoundsException(offset);
}
if (count <= 0) {
if (count < 0) {
throw new StringIndexOutOfBoundsException(count);
}
if (offset <= value.length) {
this.value = "".value;
return;
}
}
// Note: offset or count might be near -1>>>1.
if (offset > value.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
this.value = Arrays.copyOfRange(value, offset, offset+count);
}
public static char[] copyOfRange(char[] original, int from, int to) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
char[] copy = new char[newLength];
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
return copy;
}
复制一个字符数组构建一个字符串
6. 适用场景:单线程