StringBuild使用与原理

StringBuild的使用:

1、创建:

StringBuilder sb=new StringBuilder();

StringBuilder sb=new StringBuilder(200);
sb.append("Hello");
sb.append(" World!");
System.out.println(sb.toString());

// 输出结果:Hello World!

这个是StringBuild最常用的用法,把需要拼接的字符串拼接使用append(String str)放入StringBuild对象中,然后就可以进行拼接。最后使用toString()方法进行转换就可以了。

2、

在java中,字符创是不可变的,每一次的字符串都是新的值,因此,在需要对字符串进行拼接操作的时候,我们是使用StringBuild,那么,为什么StringBuild可以呢?

看源码:

因此,StringBuild是继承自AbstractStringBuilder的。

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;

    /**
     * The count is the number of characters used.
     */
    int count;

    。。。  
}

  可以看出,AbstractStringBuilder里面有两个变量value和count,这两个是关键,为什么是关键我们接着往下看:

看StringBuild我们最常用的append()方法:

   @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

  最后调用到基类,也就是AbstractStringBuilder 的方法里去了,,那么我们再看AbstractStringBuilder 中的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; }

先看前两行,判断是不是空的,如果是空的就执行appendNull()操作,这个操作是什么呢?代码如下:

   private AbstractStringBuilder appendNull() {
        int c = count;
        ensureCapacityInternal(c + 4);
        final char[] value = this.value;
        value[c++] = 'n';
        value[c++] = 'u';
        value[c++] = 'l';
        value[c++] = 'l';
        count = c;
        return this;
    }

  可见,操作是把长度count也增加4,把value增加null的四个字符,然后返回this,也就是说把null放入了AbstractStringBuilder的value中,value是一个char[]数组。而count指的正是count的值。

而看append()方法的后半段,则是先扩宽value数组的长度,然后调用String的getChars方法把传入的字符串放入value数组中,之后再增加count的长度。

因此,再toString()

之前,StringBuild的append操作实际上是把str变成了char数组存入了变量value中。那么toString()操作呢?

    @Override
    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }

  可见,是调用了String的构造方法,把chae数组value变成了String类型返回。这个就是StringBuild的实质。

原文地址:https://www.cnblogs.com/heisehenbai/p/7739924.html