StringBuilder源码学习笔记
2018-03-01 08:56
281 查看
1、public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence 2、几个构造函数 默认构造函数创建一个长度为16的StringBuilder,调用父类的构造函数,父类AbstractStringBuilder维护了char[] value,int count。如果以String或者CharSequence对象作为参数,会创建长度为str.length() + 16的StringBuilder。 AbstractStringBuilder(int capacity) { value = new char[capacity]; } public StringBuilder() { super(16); } public StringBuilder(int capacity) { super(capacity); } public StringBuilder(String str) { super(str.length() + 16); append(str); } public StringBuilder(CharSequence seq) { this(seq.length() + 16); append(seq); } 3、append方法,调用父类的append方法,如果参数的str是null,会直接append一个null字符串。内置许多重载的append方法。 @Override public StringBuilder append(Object obj) { return append(String.valueOf(obj)); } @Override public StringBuilder append(String str) { super.append(str); return this; } 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) { // overflow-conscious code if (minimumCapacity - value.length > 0) { value = Arrays.copyOf(value, newCapacity(minimumCapacity)); } } public static char[] copyOf(char[] original, int newLength) { char[] copy = new char[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } 4、StringBuilder扩容。扩容时会先生成一个newCapacity,为value.length*2+2,若其小于minCapacity,则直接扩容至minCapacity。一般情况下,newCapacity就是扩容之后的StringBuilder大小。 private int newCapacity(int minCapacity) { // overflow-conscious code int newCapacity = (value.length << 1) + 2; if (newCapacity - minCapacity < 0) { newCapacity = minCapacity; } return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0) ? hugeCapacity(minCapacity): newCapacity; } private int hugeCapacity(int minCapacity) { if (Integer.MAX_VALUE - minCapacity < 0) { // overflow throw new OutOfMemoryError(); } return (minCapacity > MAX_ARRAY_SIZE)? minCapacity : MAX_ARRAY_SIZE; } 5、delete方法。append和delete方法底层都是调用System.arraycopy方法。 @Override public StringBuilder delete(int start, int end) { super.delete(start, end); return this; } public AbstractStringBuilder delete(int start, int end) { if (start < 0) throw new StringIndexOutOfBoundsException(start); if (end > count) end = count; if (start > end) throw new StringIndexOutOfBoundsException(); int len = end - start; if (len > 0) { System.arraycopy(value, start+len, value, start, count-end); count -= len; } return this; } @Override public StringBuilder deleteCharAt(int index) { super.deleteCharAt(index); return this; } public AbstractStringBuilder deleteCharAt(int index) { if ((index < 0) || (index >= count)) throw new StringIndexOutOfBoundsException(index); System.arraycopy(value, index+1, value, index, count-index-1); count--; return this; } 6、insert方法。 @Override public StringBuilder insert(int offset, String str) { super.insert(offset, str); return this; } public AbstractStringBuilder insert(int offset, String str) { if ((offset < 0) || (offset > length())) throw new StringIndexOutOfBoundsException(offset); if (str == null) str = "null"; int len = str.length(); ensureCapacityInternal(count + len); System.arraycopy(value, offset, value, offset + len, count - offset); str.getChars(value, offset); count += len; return this; } public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); 7、toString方法,直接生成一个新的String对象。第二个是StringBuffer的toString方法,有一个String类型的toStringCache变量缓存了toString的内容。 @Override public String toString() { // Create a copy, don't share the array return new String(value, 0, count); } @Override public synchronized String toString() { if (toStringCache == null) { toStringCache = Arrays.copyOfRange(value, 0, count); } return new String(toStringCache, true); } 8、序列化方法。 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { s.defaultWriteObject(); s.writeInt(count); s.writeObject(value); } private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); count = s.readInt(); value = (char[]) s.readObject(); }
相关文章推荐
- JAVA学习笔记——字符串操作(String,StringBuffer,StringBuilder)
- Redux 学习笔记 - 源码阅读
- Java三大集合类源码阅读笔记【包含超类Collection】提供学习源码
- [TensorFlow 学习笔记-08]tf.pad函数源码解析
- mysql源码学习笔记:基于binlog的recovery机制
- Android源码学习笔记:Context、ActivityThread和Activity的生命周期
- zepto源码--核心方法9(管理包装集)--学习笔记
- Mjpeg-streamer源码学习笔记-Main-线程(四)
- prototype.js 源码学习笔记(二)
- APM源码学习笔记一、开篇
- C++11学习笔记:std::move和std::forward源码分析
- 菜鸟的jQuery源码学习笔记(前言)
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源码放送
- nginx 源码学习笔记(二十)—— event 模块(一) ——初始化
- CAFFE源码学习笔记之初始化Filler
- nginx 源码学习笔记(一)——初识nginx helloworld模块
- Android2.1消息应用(Messaging)源码学习笔记
- 比特币源码学习笔记(一)
- Hadoop学习笔记(10) ——搭建源码学习环境
- LinkedHashMap、LinkedHashSet源码学习笔记