Java StringBuilder解析

1、底层原理

StringBuilder类底层也是一个数组,但是没有被final修饰,可以改变长度。该数组的初化长度是16。
StringBuilder类继承抽象类AbstractStringBuilder;
StringBuilder类在默认构造函数中,调用超类AbstractStringBuilder(int capacity)构造函数进行初始化,数组的默认初始长度为16。

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
	...
    /**
     * Constructs a string builder with no characters in it and an
     * initial capacity of 16 characters.
     */
    public StringBuilder() {
        super(16);
    }
     ....
 }

抽象类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;

    /**
     * This no-arg constructor is necessary for serialization of subclasses.
     */
    AbstractStringBuilder() {
    }

    /**
     * Creates an AbstractStringBuilder of the specified capacity.
     */
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }
    ....
 }

2、构造方法

除了默认构造方法,初化始16长度的数组;StringBuilder还存在其他的构造方法:

/**
     * Constructs a string builder with no characters in it and an
     * initial capacity specified by the {@code capacity} argument.
     *
     * @param      capacity  the initial capacity.
     * @throws     NegativeArraySizeException  if the {@code capacity}
     *               argument is less than {@code 0}.
     */
    public StringBuilder(int capacity) {
        super(capacity);
    }

    /**
     * Constructs a string builder initialized to the contents of the
     * specified string. The initial capacity of the string builder is
     * {@code 16} plus the length of the string argument.
     *
     * @param   str   the initial contents of the buffer.
     */
    public StringBuilder(String str) {
        super(str.length() + 16);
        append(str);
    }

例子:

	StringBuilder stringBuilder1 = new StringBuilder(32);
    StringBuilder stringBuilder2 = new StringBuilder("StringBuilder2");
    CharSequence seq="stringBuilder3";
    StringBuilder stringBuilder3 = new StringBuilder(seq);

3、成员方法append

注意:StringBuilder的成员方法append返回的this对象。

    @Override
    public StringBuilder append(CharSequence s, int start, int end) {
        super.append(s, start, end);
        return this;
    }

    @Override
    public StringBuilder append(char[] str) {
        super.append(str);
        return this;
    }

例子:

StringBuilder stringBuilder1 = new StringBuilder();
//append方法返回的是this,即以后语句stringBuilder1的地址赋值给    stringBuilder2
StringBuilder stringBuilder2 = stringBuilder1.append("Hello");

System.out.println(stringBuilder1); //结果为"Hello"
System.out.println(stringBuilder2); //结果为"Hello"
System.out.println(stringBuilder1==stringBuilder2); //结果是true

4、成员方法toString

通过成员方法toString,可以将StringBuilder对象转换为String对象

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

例子:

 String str1 ="Hello";
 StringBuilder stringBuilder = new StringBuilder(str1);
 stringBuilder.append("World");
 String str2= stringBuilder.toString();
 System.out.println(str2); //结果输出为“HelloWorld”

5、StringBuilder总结

  • StringBuilder ()
    构造一个空的字符串构建器。
  • int length ( )
    返回构建器或缓冲器中的代码单元数量。
  • Stri ngBuilder append ( String str )
    追加一个字符串并返回 this。
  • StringBuilder append ( char c )
    追加一个代码单元并返回 this。
  • StringBuilder appendCodePoint ( int cp )
    追加一个代码点, 并将其转换为一个或两个代码单元并返回 this 。
  • void setCharAt ( int i , char c )
    将第 i 个代码单元设置为 c。
  • StringBuilder insert ( int offset , String str )
    在 offset 位置插入一个字符串并返回 this。
  • StringBuilder insert ( int offset , Char c )
    在 offset 位置插入一个代码单元并返回 this。
  • StringBuilder delete ( int startindex , int endlndex )
    删除偏移量从 startindex 到 endlndex - 1 的代码单元并返回 this。
  • String toString ( )
    返回一个与构建器或缓冲器内容相同的字符串。
原创文章 56 获赞 8 访问量 4736

猜你喜欢

转载自blog.csdn.net/jpgzhu/article/details/105615964