Java中的StringBuffer和StringBuilder介绍


  

引言:

Java中除了String类与字符串相关外,还有StringBuffer和StringBiulder也都要与字符串操作有关。String是不可变字符序列,StringBuffer是可变字符序列

一、StringBuffer 类

  java.lang.StringBuffer代表可变的字符序列,在JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。StringBuffer其本身继承于AbstractStringBiulder抽象类,且是一个被声明为final的类,不可再被继承。其中的很多方法与String相同。
AbstractStringBiulder抽象类的声明
StringBuffer类的声明

1、StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:

  1. StringBuffer():初始容量为16的字符串缓冲区
  2. StringBuffer(int size):构造指定容量的字符串缓冲区
  3. StringBuffer(String str):将内容初始化为指定字符串内容

2、StringBuffer类中的常用方法

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

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

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

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

  5. StringBuffer reverse():把当前字符序列逆转
    说明:

    • 当append和insert时,如果原来value数组长度不够,可扩容。
    • StringBuffer中的大部分方法都是同步方法synchronized,所以StringBuffer是线程安全的。
    • 如上这些方法支持方法链操作。
    • 方法链的原理:方法链
  6. 此外,还定义了如下的方法:

    • public int indexOf(String str)
    • public String substring(int start,int end)
    • public int length()
    • public char charAt(int n )
    • public void setCharAt(int n ,char ch)

7.** 总结:**

增: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()

二、StringBiulder 类

  StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样。同样StringBuilder其本身继承于AbstractStringBiulder抽象类,且是一个被声明为final的类,不可再被继承。
方法链

三、String、StringBuffer、StringBiulder三者的异同

  1. String:不可变的字符序列;底层使用final char[]存储

  2. StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储

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

  4. 源码分析:

    String str = new String();//char[] value = new char[0];
    String str1 = new String(“abc”);//char[] value = new char[]{‘a’,’b’,’c’};

    StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建了一个长度是16的数组。
    System.out.println(sb1.length());//0,return count;
    sb1.append(‘a’);//value[0] = ‘a’;
    sb1.append(‘b’);//value[1] = ‘b’;

    StringBuffer sb2 = new StringBuffer(“abc”);//char[] value = new char[“abc”.length() + 16];
    System.out.println(sb2.length());//3,return count;

  5. 说明:

    • 扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。
    • 指导意义:开发中建议大家使用:StringBuffer(int capacity) 或 StringBuilder(int capacity)

四、String、StringBuffer、StringBiulder三者的效率对比

从高到低排列:StringBuilder(非线程安全) > StringBuffer(线程安全) > String

public class JUnitTest {
    @Test
    public void test() {
        //初始设置
        long startTime = 0L;
        long endTime = 0L;
        String text = "";
        StringBuffer buffer = new StringBuffer("");
        StringBuilder builder = new StringBuilder("");

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

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

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

五、String 与 StringBuffer和StringBuilder的转转

  1. String –> StringBuffer / StringBuilder :调用StringBuffer或StringBuilder的构造器
  2. StringBuffer / StringBuilder –> String :①调用String的构造器 ②调用StringBuffer或StringBuilder的toString()方法。

文章作者: YangChongZhi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YangChongZhi !
评论
 上一篇
Java中JDK8之前关于时间的API Java中JDK8之前关于时间的API
   引言: java在JDK8之前就提供了一些较为常用的关于时间的API。 一、java.lang.System 类  System类提供的 public static long currentTimeMillis() 用来返回当前时间
2021-01-08
下一篇 
Java中的String类介绍 Java中的String类介绍
   引言: Java中常用的与字符串相关的类有String,StringBuffer,StringBuilder。 String类1、介绍  String是一个final类,不能再被继承。代表不可变字符序列。字符串是常量,用双引号引起来
2021-01-07
  目录