StringBuilder、StringBuffer类
StringBuffer和StringBuilder非常类似,均代表可变的字符序列。这两个类都是抽象类AbstractStringBuilder的子类,方法几乎一模一样。
两个类的区别主要是:
- StringBuffer JDK1.0提供的类,线程安全,做线程同步检查,效率较低。
- StringBuilder JDK1.5提供的类,线程不安全,不做线程同步检查,因此效率较高。 建议采用该类。
使用StringBuilder类:
package com.bisxt.builder;
//使用场合是什么?SQL语句的拼接,追加查询条件
/*
StringBuilder builder=new StringBuilder("select * from job where 1=1");
if(sal>10000){ //sal薪资
builder.append("and sal >"+sal);
}
if(site!=null){ //site 地点
builder.append("and site ="+site);
}
if(position!=null){ //position 职位
builder.append("and position ="+position);
}
*/
public class TestStringBuilder {
public static void main(String[] args) {
//1.创建一个StringBuilder对象
//StringBuilder builder = new StringBuilder();
StringBuilder builder = new StringBuilder("中华人民共和国");
//2.对StringBuilder进行操作
//2.1末尾追加
builder.append("山东省");
builder.append("菏泽市");
builder.append("牡丹区");
builder.append("小留镇");
builder.append("张庄");
System.out.println(builder);
//2.2中间添加
builder.insert(7, "华北地区");
System.out.println(builder);
//2.3删除
builder.delete(7, 14);
System.out.println(builder);
//2.4修改
builder.replace(7, 10, "青岛市");//注意start、end的范围
System.out.println(builder);
//2.5反转
builder.reverse();
System.out.println(builder);
//2.6StringBuilder-->String
String str=builder.toString();
System.out.println(str);
}
}
理解StringBuilder类的源码:
- StringBuilder类和String类一样,也是一个字符串数组value,但不是final的。变量count表示底层字符数组的元素的真实个数,不是底层字符数组的长度。
- 默认字符数组的长度是16,也可以通过构造方法直接指定初始长度。length()方法返回的是字符数组元素的真实个数,capacity()返回的是底层数组的长度。
- 每次添加字符串后超出原来的数组长度后要扩容,扩容的默认策略时候增加到原来长度的2倍再加2。
public AbstractStringBuilder append(String str) {
//如果添加的字符串是null,特殊处理
if (str == null)
return appendNull();
//获取要新增的字符串的长度
int len = str.length();
//要扩容,要扩容多少呢?
ensureCapacityInternal(count + len);
//扩容后将新的字符串追加到最后
str.getChars(0, len, value, count);
//字符串的长度增加了
count += len;
//返回最新的StringBuilder
return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
//如果长度不足,就扩容
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
private int newCapacity(int minCapacity) {
//默认策略:数组原来长度的2倍+2
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
return (newCapacity <= 0 ||MAX_ARRAY_SIZE-newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}