java.lang.StringBuilder源码分析
Posted 没有梦想的小灰灰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.lang.StringBuilder源码分析相关的知识,希望对你有一定的参考价值。
StringBuilder是一个可变序列的字符数组对象,它继承自AbstractStringBuilder抽象类。它不保证同步,设计出来的目的是当这个字符串缓存只有单线程使用的时候,取代StringBuffer的。建议使用它而不是StringBuffer,因为它的速度更快。
StringBuilder有自己的容量(字符数组),当容量还没有被占满的时候,不必申请新的空间,当容量被占满后,它会自动地扩容。
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence { public StringBuilder() {//构造方法只是调用父类的构造器 super(16); } public StringBuilder(int capacity) {//capacity指定容量大小 super(capacity); } public StringBuilder(String str) {//str指定初始容器存放的字符串,容量是str.length+16 super(str.length() + 16); append(str); } public StringBuilder(CharSequence seq) { this(seq.length() + 16); append(seq); }
//StringBuilder重载了父类所有的append方法,以支持添加任何类型的数据到容器中 @Override public StringBuilder append(Object obj) { return append(String.valueOf(obj)); } @Override public StringBuilder append(String str) { super.append(str); return this; } public StringBuilder append(StringBuffer sb) { super.append(sb); return this; } @Override public StringBuilder append(CharSequence s) { super.append(s); return this; } 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; } //...更多的append重载方法,实现在StringBuilder append所有数据类型 public StringBuilder appendCodePoint(int codePoint) {//这个方法是通过Unicode编码来append一个字符,比如‘a‘的Unicode=97,appendCodePoint(97)相当于把a添加到容器末尾 super.appendCodePoint(codePoint); return this; } public StringBuilder delete(int start, int end) {//删除end-start的子串 super.delete(start, end); return this; } public StringBuilder deleteCharAt(int index) {//删除index下标的字符 super.deleteCharAt(index); return this; } public StringBuilder replace(int start, int end, String str) {//用str取代end-start的子串 super.replace(start, end, str); return this; }
//insert方法实现在字符串的任意位置插入数据 public StringBuilder insert(int index, char[] str, int offset, int len) { super.insert(index, str, offset, len); return this; } //...更多的insert重载方法 public int indexOf(String str) {//找到子串的起始位置 return super.indexOf(str); } //...更多的indexOf重载方法,实现找到子串的位置 public StringBuilder reverse() {//将容器内的字符串倒转 super.reverse(); return this; } public String toString() {//toString是返回new一个String对象 // Create a copy, don‘t share the array return new String(value, 0, count); } private void writeObject(java.io.ObjectOutputStream s)//writeObeject提供序列化机制 throws java.io.IOException { s.defaultWriteObject(); s.writeInt(count); s.writeObject(value); } private void readObject(java.io.ObjectInputStream s)//readObject提供反序列化机制 throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); count = s.readInt(); value = (char[]) s.readObject(); } }
StringBuilder内部维护一个字符数组,在这个字符数组上对字符进行各种操作,当需要对字符串进行频繁操作时,StringBuilder能提供很好的性能,比起直接操作String,它不需要创建很多对象。
以上是关于java.lang.StringBuilder源码分析的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.StringBuilder和java.lang.StringBuffer