zoukankan      html  css  js  c++  java
  • Java常用类:StringBuilder

    一、介绍

    StringBuilder是一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)StringBuilder类可以用于在无需创建一个新的字符串对象情况下修改字符串。StringBuilder不是线程安全的,而StringBuffer是线程安全的。但StringBuilder在单线程中的性能比StringBuffer高。StringBuilder类来源于jdk1.5及以后的版本

    常用方法:

    1、append();   //追加到末尾

    2、insert(int offset,String str) ;   //在指定的索引处插入字符串

    3、delete(int startIndex,int endIndex)  //删除区域索引[startIndex,endIndex)的字符

    4、reverse()  //反转

    StringBuilder的孪生兄弟StringBuffer,因为它们有一个相同的父类AbstractStringBuilder


    二、源码解析
    1
    2
    3
    4
    5
    //同样,StringBuilder也是final修饰的不可变,相比String来说,继承了AbstractStringBuilder,StringBuffer也是同样继承了该类
    public final class StringBuilder
        extends AbstractStringBuilder
        implements java.io.Serializable, CharSequence
    {

    AbstractStringBuilder类是一个抽象类,有两个子类:StringBuffer和StringBuilder


    AbstractStringBuilder类中有两个属性,分别是char value[];//值、int count;//长度。所以,StringBuilder里是直接可以用的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public StringBuilder() {
        super(16);//默认创建了一个长度为16的char数组
    }
    public StringBuilder(int capacity) {
        super(capacity);//也可以自定义长度
    }
    public StringBuilder(String str) {
        super(str.length() + 16);//调用父类构造器:并且在原来的16上再加上传来str的长度
        append(str);//然后再追加
     }
     //看看append方法
    public StringBuilder append(String str) {
        super.append(str);//调用了父类的append方法。
        return this;
    }
    public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
            int len = str.length();
        if (len == 0) return this;
        int newCount = count + len;
        if (newCount > value.length)
            expandCapacity(newCount);
        str.getChars(0, len, value, count);//从0开始,到当前数组长度,进行拷贝
        count = newCount;
        return this;
    }

    StringBuilder重载了很多append方法


    查看源码发现,所有的append方法里最后都有一句return this,有什么作用呢?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //StringBuilder的创建
    StringBuilder sb = new StringBuilder();//数组长度初始为16
    StringBuilder sb2 = new StringBuilder(32);//长度直接为32
    StringBuilder sb3 = new StringBuilder("abc");//1、初始化长度为16+abc的长度=19    2、把a,b,c放到长度为19的value数组里value={'a','b','c','u0000','u0000','u0000'.....}
    //StringBuilder的append
    sb.append("a").append("b").append("c");//源码中return this的作用(方法链)
    /**
     * 上述sb.append("a").append("b").append("c")代码解析:
     * sb.append("a")追加完了后,最后return this,也就还是sb对象。
     * sb.append("a").append("b") 也就等于sb.append("b")  最后还是return this
     * sb.append("a").append("b").append("c") 也就等于sb.append("c") 最后还是return this
     */

    return this的作用就是使调用成一个方法链,可以一直调用append。


    三、总结

    1、StringBuilder和StringBuffer都是继承了AbstractStringBuilder这个抽象类

    2、StringBuilder同样是final修饰的,不可改变。跟String很多类似的地方

    3、StringBuilder线程不安全,单线程效率高(比较常用)

    4、StringBuilder创建对象个数问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    StringBuilder sb4 = new StringBuilder("abc");//这里两个对象,一个abc,一个new StringBuilder
    for (int i = 0; i < 10; i++) {
        sb4.append(i);//这里从始至终还是sb4一个对象
    }//以上代码块,总共2个对象
     
    //这里有个问题,既然内部是用数组实现的。并且长度也是指定的了。那么每次append不就增加一个了吗?
    //那这个长度是怎么加上的呢,这就得说内部的容量扩容了,继续查看源码,源码中有一句关键代码:
    if (spaceNeeded > value.length)//如果大于数组长度
                expandCapacity(spaceNeeded);//则,扩容
    //expandCapacity方法
    void expandCapacity(int minimumCapacity) {
        int newCapacity = (value.length + 1) * 2;//1,计算新容量:在原来的基础上+1然后乘2
            if (newCapacity < 0) {
                newCapacity = Integer.MAX_VALUE;
            } else if (minimumCapacity > newCapacity) {
            newCapacity = minimumCapacity;
        }
        //2,重新复制出一个新数组,新数组的长度就是刚计算的长度。然后将原来的value变量指向到新数组。
        //原来的老数组value没有被引用了,就会被垃圾回收
        value = Arrays.copyOf(value, newCapacity);
    }








  • 相关阅读:
    汉明距离
    Go_go build 和 go install
    rabbitmq的简单介绍二
    rabbitmq的简单介绍一
    redis的订阅和发布
    python操作redis
    vmware虚拟机开机报附件中的错误的解决办法
    使用twised实现一个EchoServer
    python事件驱动的小例子
    mysql数据库的最基本的命令
  • 原文地址:https://www.cnblogs.com/meet/p/4696543.html
Copyright © 2011-2022 走看看