stringBuffer 与StringBulider长度分析

来源:互联网 发布:php博客聊天源码 编辑:程序博客网 时间:2024/05/21 05:06

StringBuffer在实现的时候继承了AbstractStringBulider,并实现了序列化,和CharSequece

具体定义如下:

 public final class StringBuffer

    extends AbstractStringBuilder

    implements java.io.Serializable, CharSequence

{

    private transient char[] toStringCache;

  1:  public StringBuffer() {  // 无参构造方式

        super(16);

}

....

2: public StringBuffer(int capacity) { // 指定缓冲区长度

        super(capacity);

    }

3public StringBuffer(String str) {   // 传入指定字符串

        super(str.length() + 16);

        append(str);

    }

}

对于1实现的都是其父类AbstractStringBulider ()的构造方法,

 AbstractStringBuilder(int capacity) {

        value = new char[capacity];

}

执行1的时候默认传入16个字节,给父类初始化字节数组。当执行2时会实现如下方法 AbstractStringBuilder(int capacity) {

        value = new char[capacity];

    }

该方法会指定缓冲区的大小。对于执行3方法时如下:

public StringBuffer(String str) {

        super(str.length() + 16);

        append(str);

    }

其会在传入长度的基础上添加16个字节的空间。

在使用append()方法在字符串后面进行追加的时候如果长度超过了该字符串的存储空间的大小的时候,就需要进行扩充,

public AbstractStringBuilder append(String str) {

        if (str == null) 

            return appendNull();

        int len = str.length();

        ensureCapacityInternal(count + len);

        str.getChars(0, len, value, count);// 将字符串复制到指定的字符数组中

        count += len; // 使用字符的个数

        return this;

    }

   private void ensureCapacityInternal(int minimumCapacity) {

             if (minimumCapacity - value.length > 0)// 判断所追加的字符是否超出字节的缘由空间

            expandCapacity(minimumCapacity);

    }

  

  

    void expandCapacity(int minimumCapacity) {

        int newCapacity = value.length * 2 + 2; // 将原来的空间变为原来的二倍并加2

        if (newCapacity - minimumCapacity < 0) // 改变后的空间仍不够

            newCapacity = minimumCapacity; 

        if (newCapacity < 0) { 

            if (minimumCapacity < 0) // 溢出

                throw new OutOfMemoryError();

            newCapacity = Integer.MAX_VALUE; //赋值为整型最大的值

        }

 

        value = Arrays.copyOf(value, newCapacity); // 将原来字符数组的值重新复制到//新增的数组内

    }

1StringBuffer提供了一个字符翻转方法为:reverse();

2StringBuffer提供的insert()方法,不会覆盖,而是移动元素

3:对于setLength()如果设定的长度小于现存的长度,将只保留原来的部分。

StringBulider在实现的时候继承也了AbstractStringBulider,并实现了序列化,和CharSequece

其空间分配与StringBuffer一模一样。

最大区别在于:

StringBuffer是线程安全的,而StringBulider线程不安全的

 

0 0
原创粉丝点击