StringBuffer类

110 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情


概述

StringBuffer类是代表可变的字符序列。可以对字符串内容进行增删,此时不会产生新的对象。


String、StringBuffer和StringBuilder

Q:String、StringBuffer和StringBuilder的异同

  • String:可变的字符序列;底层使用char[]存储
  • StringBuffer:可变的字符序列;线程安全但效率低;底层使用char[]存储
  • StringBuilder:可变的字符序列;JDK5.0新增,线程不安全但效率高;底层使用char[]存储

🎈效率比较:

从高到低排列:StringBuilder > StringBuffer > String

    @Test
    public void test(){
        //初始设置
        long startTime = 0L;
        long endTime = 0L;
        String text = "";
        StringBuffer buffer = new StringBuffer("");
        StringBuilder builder = new StringBuilder("");
        //开始对比
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            buffer.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer的执行时间:" + (endTime - startTime));

        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            builder.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder的执行时间:" + (endTime - startTime));

        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            text = text + i;
        }
        endTime = System.currentTimeMillis();
        System.out.println("String的执行时间:" + (endTime - startTime));

    }

StringBuffer源码分析

创建

当new一个StringBuffer的对象时(空参时),底层创建了一个长度为16的字符数组char[] value。 但是如果没往这个数组里加东西,我们输出“对象.length()”的时候依然是0。

另外的:创建对象不用空参,比如

StringBuffer sb1 = new StringBuffer("abc");

相当于底层创建了长度为: "abc".length() + 16长度的字符数组

扩容

当底层数组容量不够时,则原容量* 2+2作为新数组的长度。并将原有数组中的元素复制到新数组中。


StringBuffer的常用方法

  • StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接

  • StringBuffer delete(int start,int end):删除指定位置的内容

  • StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str

  • StringBuffer insert(int offset, xxx):在指定位置插入xxx

  • StringBuffer reverse() :把当前字符序列逆转

  • public int indexOf(String str):返回首次出现位置

  • public String substring(int start,int end):返回一个从start开始到end索引结束的左闭右开区间的子字符串

  • public int length()

  • public char charAt(int n )

  • public void setCharAt(int n ,char ch):将指定位置的字符改成新的

@Test
public void test(){
    StringBuffer s1 = new StringBuffer("abc");
    s1.append(1); //看成字符串的拼接
    s1.append('1');
    System.out.println(s1);
    s1.delete(2,4); //左闭右开,删除索引为2,3元素
    s1.replace(2,4,"hello"); //左闭右开,将索引2到3的元素替换成 hello这个新字符串
    s1.insert(2,false); //在索引2的位置元素前插入
    s1.reverse(); //逆转当前字符串
    String s2 = s1.substring(1, 3); //从索引1到2的元素切下来给s2
    System.out.println(s1);
    System.out.println(s1.length());
    System.out.println(s2);
}

总结:

  • 增:append(xxx)
  • 删:delete(int start,int end)
  • 改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
  • 查:charAt(int n )
  • 插:insert(int offset, xxx)
  • 长度:length();
  • 遍历:for() + charAt() / toString()