Java - JavaSE - String | StringBuffer
String 类
正则表达式
Pattern 类
s.matches();
s.replaceFirst();
s.replaceAll();
s.split();
StringBuffer
文档说明
根据 StringBuffer 的文档说明可知:
StringBuffer 是线程安全的,主要体现在它的方法上有 synchronized 同步锁,也因此导致其执行效率较低。
StringBuffer 虽然是线程安全的,但是其安全指的是操作上的安全,需要处理的数据在处理过程中不能改变,或者处理的数据不被其他线程共享。也就是处理的数据中途自身发生改变,则得到的结果可能和想要的结果不一致,这种不一致并不是因为线程不安全,而是数据自身的不稳定。
StringBuffer 主要有两个常用方法,append() 和 insert()。
容量问题,如果不超过则不会扩容,超过容量自动扩容。
传入的参数不能是 null,否则会报出 NullPointException。
JDK 5 加入了 StringBuilder,它适用于单线程,且操作相同,由于没有加入 synchronized 同步机制,使得它能更快完成任务,官方优先推荐使用。
StringBuffer 初始化容量
public StringBuffer() {
super(16);
}
public StringBuffer(int capacity) {
super(capacity);
}
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
public StringBuffer(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
由构造方法的源码可知,有三种初始化容量:
- 无参,容量为 16.
- 传入容量值.
- 传入 String 或 实现 CharSequence 接口的类型的数据长度 + 16.
StringBuffer 扩容
StringBuffer 在使用 append() 方法时会扩容,策略有两种:
-
先将当前容量 * 2,再加 2.
-
如果此时容量还比追加后的 StringBuffer 长度 minCapacity 小,则使用minCapacity.
-
此时的容量仍需要判断是否超出 StringBuffer 规定的最大容量,如果超过则可能报出 OutOfMemoryError 异常.
注:可能 是因为 StringBuffer 规定的最大容量和 Integer.MAX_VALUE 仍有 8 个空位.
/*
AbstractStringBuilder.java
StringBuffer 调用的 append() 方法中调用了父类的这个方法
*/
private int newCapacity(int minCapacity) {
// overflow-conscious code
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}
private int hugeCapacity(int minCapacity) {
if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
throw new OutOfMemoryError();
}
return (minCapacity > MAX_ARRAY_SIZE)
? minCapacity : MAX_ARRAY_SIZE;
}
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/*
Integer.java
*/
@Native public static final int MAX_VALUE = 0x7fffffff;
为了避免频繁扩容影响运行效率,可以提前设定好 StringBuffer 的容量。