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 ( )
返回一个与构建器或缓冲器内容相同的字符串。