常用类---StringBuilder、StringBuffer

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;
}

猜你喜欢

转载自blog.csdn.net/qq_40836864/article/details/113475329