StringBuilder详解(String系列之2)本章介绍StringBuilder以及它的API的详细使⽤⽅法。
StringBuilder 简介StringBuilder 是⼀个可变的字符序列。
它继承于AbstractStringBuilder,实现了CharSequence接⼝。
StringBuffer 也是继承于AbstractStringBuilder的⼦类;但是,StringBuilder和StringBuffer不同,前者是⾮线程安全的,后者是线程安全的。
StringBuilder 和 CharSequence之间的关系图如下:StringBuilder函数列表StringBuilder()StringBuilder(int capacity)StringBuilder(CharSequence seq)StringBuilder(String str)StringBuilder append(float f)StringBuilder append(double d)StringBuilder append(boolean b)StringBuilder append(int i)StringBuilder append(long l)StringBuilder append(char c)StringBuilder append(char[] chars)StringBuilder append(char[] str, int offset, int len)StringBuilder append(String str)StringBuilder append(Object obj)StringBuilder append(StringBuffer sb)StringBuilder append(CharSequence csq)StringBuilder append(CharSequence csq, int start, int end)StringBuilder appendCodePoint(int codePoint)int capacity()char charAt(int index)int codePointAt(int index)int codePointBefore(int index)int codePointCount(int start, int end)StringBuilder delete(int start, int end)StringBuilder deleteCharAt(int index)void ensureCapacity(int min)void getChars(int start, int end, char[] dst, int dstStart)int indexOf(String subString, int start)int indexOf(String string)StringBuilder insert(int offset, boolean b)StringBuilder insert(int offset, int i)StringBuilder insert(int offset, long l)StringBuilder insert(int offset, float f)StringBuilder insert(int offset, double d)StringBuilder insert(int offset, char c)StringBuilder insert(int offset, char[] ch)StringBuilder insert(int offset, char[] str, int strOffset, int strLen)StringBuilder insert(int offset, String str)StringBuilder insert(int offset, Object obj)StringBuilder insert(int offset, CharSequence s)StringBuilder insert(int offset, CharSequence s, int start, int end)int lastIndexOf(String string)int lastIndexOf(String subString, int start)int length()int offsetByCodePoints(int index, int codePointOffset)StringBuilder replace(int start, int end, String string)StringBuilder reverse()void setCharAt(int index, char ch)void setLength(int length)CharSequence subSequence(int start, int end)String substring(int start)String substring(int start, int end)String toString()void trimToSize()AbstractStringBuilder 和 StringBuilder源码AbstractStringBuilder源码(基于jdk1.7.40)1package ng;23import sun.misc.FloatingDecimal;4import java.util.Arrays;56abstract class AbstractStringBuilder implements Appendable, CharSequence { 7char[] value;89int count;1011 AbstractStringBuilder() {12 }1314 AbstractStringBuilder(int capacity) {15 value = new char[capacity];16 }1718public int length() {19return count;20 }2122public int capacity() {23return value.length;24 }2526public void ensureCapacity(int minimumCapacity) {27if (minimumCapacity > 0)28 ensureCapacityInternal(minimumCapacity);29 }3031private void ensureCapacityInternal(int minimumCapacity) {32// overflow-conscious code33if (minimumCapacity - value.length > 0)34 expandCapacity(minimumCapacity);35 }3637void expandCapacity(int minimumCapacity) {38int newCapacity = value.length * 2 + 2;39if (newCapacity - minimumCapacity < 0)40 newCapacity = minimumCapacity;41if (newCapacity < 0) {42if (minimumCapacity < 0) // overflow43throw new OutOfMemoryError();44 newCapacity = Integer.MAX_VALUE;45 }46 value = Arrays.copyOf(value, newCapacity);47 }4849public void trimToSize() {50if (count < value.length) {51 value = Arrays.copyOf(value, count);52 }53 }5455public void setLength(int newLength) {56if (newLength < 0)57throw new StringIndexOutOfBoundsException(newLength);58 ensureCapacityInternal(newLength);5960if (count < newLength) {61for (; count < newLength; count++)62 value[count] = '\0';63 } else {64 count = newLength;65 }66 }6768public char charAt(int index) {69if ((index < 0) || (index >= count))70throw new StringIndexOutOfBoundsException(index);71return value[index];72 }7374public int codePointAt(int index) {75if ((index < 0) || (index >= count)) {76throw new StringIndexOutOfBoundsException(index);77 }78return Character.codePointAt(value, index);79 }8081public int codePointBefore(int index) {82int i = index - 1;86return Character.codePointBefore(value, index);87 }8889public int codePointCount(int beginIndex, int endIndex) {90if (beginIndex < 0 || endIndex > count || beginIndex > endIndex) {91throw new IndexOutOfBoundsException();92 }93return Character.codePointCountImpl(value, beginIndex, endIndex-beginIndex);94 }9596public int offsetByCodePoints(int index, int codePointOffset) {97if (index < 0 || index > count) {98throw new IndexOutOfBoundsException();99 }100return Character.offsetByCodePointsImpl(value, 0, count,101 index, codePointOffset);102 }103104public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)105 {106if (srcBegin < 0)107throw new StringIndexOutOfBoundsException(srcBegin);108if ((srcEnd < 0) || (srcEnd > count))109throw new StringIndexOutOfBoundsException(srcEnd);110if (srcBegin > srcEnd)111throw new StringIndexOutOfBoundsException("srcBegin > srcEnd");112 System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);113 }114115public void setCharAt(int index, char ch) {116if ((index < 0) || (index >= count))117throw new StringIndexOutOfBoundsException(index);118 value[index] = ch;119 }120121public AbstractStringBuilder append(Object obj) {122return append(String.valueOf(obj));123 }124125public AbstractStringBuilder append(String str) {126if (str == null) str = "null";127int len = str.length();128 ensureCapacityInternal(count + len);129 str.getChars(0, len, value, count);130 count += len;131return this;132 }133134// Documentation in subclasses because of synchro difference135public AbstractStringBuilder append(StringBuffer sb) {136if (sb == null)137return append("null");138int len = sb.length();139 ensureCapacityInternal(count + len);140 sb.getChars(0, len, value, count);141 count += len;142return this;143 }144145// Documentation in subclasses because of synchro difference146public AbstractStringBuilder append(CharSequence s) {147if (s == null)148 s = "null";149if (s instanceof String)150return this.append((String)s);151if (s instanceof StringBuffer)152return this.append((StringBuffer)s);153return this.append(s, 0, s.length());154 }155156public AbstractStringBuilder append(CharSequence s, int start, int end) {157if (s == null)158 s = "null";159if ((start < 0) || (start > end) || (end > s.length()))160throw new IndexOutOfBoundsException(161 "start " + start + ", end " + end + ", s.length() "162 + s.length());163int len = end - start;164 ensureCapacityInternal(count + len);165for (int i = start, j = count; i < end; i++, j++)166 value[j] = s.charAt(i);170171public AbstractStringBuilder append(char[] str) {172int len = str.length;173 ensureCapacityInternal(count + len);174 System.arraycopy(str, 0, value, count, len);175 count += len;176return this;177 }178179public AbstractStringBuilder append(char str[], int offset, int len) { 180if (len > 0) // let arraycopy report AIOOBE for len < 0 181 ensureCapacityInternal(count + len);182 System.arraycopy(str, offset, value, count, len);183 count += len;184return this;185 }186187public AbstractStringBuilder append(boolean b) {188if (b) {189 ensureCapacityInternal(count + 4);190 value[count++] = 't';191 value[count++] = 'r';192 value[count++] = 'u';193 value[count++] = 'e';194 } else {195 ensureCapacityInternal(count + 5);196 value[count++] = 'f';197 value[count++] = 'a';198 value[count++] = 'l';199 value[count++] = 's';200 value[count++] = 'e';201 }202return this;203 }204205public AbstractStringBuilder append(char c) {206 ensureCapacityInternal(count + 1);207 value[count++] = c;208return this;209 }210211public AbstractStringBuilder append(int i) {212if (i == Integer.MIN_VALUE) {213 append("-2147483648");214return this;215 }216int appendedLength = (i < 0) ? Integer.stringSize(-i) + 1217 : Integer.stringSize(i);218int spaceNeeded = count + appendedLength;219 ensureCapacityInternal(spaceNeeded);220 Integer.getChars(i, spaceNeeded, value);221 count = spaceNeeded;222return this;223 }224225public AbstractStringBuilder append(long l) {226if (l == Long.MIN_VALUE) {227 append("-9223372036854775808");228return this;229 }230int appendedLength = (l < 0) ? Long.stringSize(-l) + 1231 : Long.stringSize(l);232int spaceNeeded = count + appendedLength;233 ensureCapacityInternal(spaceNeeded);234 Long.getChars(l, spaceNeeded, value);235 count = spaceNeeded;236return this;237 }238239public AbstractStringBuilder append(float f) {240new FloatingDecimal(f).appendTo(this);241return this;242 }243244public AbstractStringBuilder append(double d) {245new FloatingDecimal(d).appendTo(this);246return this;247 }248249public AbstractStringBuilder delete(int start, int end) {250if (start < 0)253 end = count;254if (start > end)255throw new StringIndexOutOfBoundsException();256int len = end - start;257if (len > 0) {258 System.arraycopy(value, start+len, value, start, count-end); 259 count -= len;260 }261return this;262 }263264public AbstractStringBuilder appendCodePoint(int codePoint) {265final int count = this.count;266267if (Character.isBmpCodePoint(codePoint)) {268 ensureCapacityInternal(count + 1);269 value[count] = (char) codePoint;270this.count = count + 1;271 } else if (Character.isValidCodePoint(codePoint)) {272 ensureCapacityInternal(count + 2);273 Character.toSurrogates(codePoint, value, count);274this.count = count + 2;275 } else {276throw new IllegalArgumentException();277 }278return this;279 }280281public AbstractStringBuilder deleteCharAt(int index) {282if ((index < 0) || (index >= count))283throw new StringIndexOutOfBoundsException(index);284 System.arraycopy(value, index+1, value, index, count-index-1); 285 count--;286return this;287 }288289public AbstractStringBuilder replace(int start, int end, String str) { 290if (start < 0)291throw new StringIndexOutOfBoundsException(start);292if (start > count)293throw new StringIndexOutOfBoundsException("start > length()"); 294if (start > end)295throw new StringIndexOutOfBoundsException("start > end"); 296297if (end > count)298 end = count;299int len = str.length();300int newCount = count + len - (end - start);301 ensureCapacityInternal(newCount);302303 System.arraycopy(value, end, value, start + len, count - end); 304 str.getChars(value, start);305 count = newCount;306return this;307 }308309public String substring(int start) {310return substring(start, count);311 }312313public CharSequence subSequence(int start, int end) {314return substring(start, end);315 }316317public String substring(int start, int end) {318if (start < 0)319throw new StringIndexOutOfBoundsException(start);320if (end > count)321throw new StringIndexOutOfBoundsException(end);322if (start > end)323throw new StringIndexOutOfBoundsException(end - start);324return new String(value, start, end - start);325 }326327public AbstractStringBuilder insert(int index, char[] str, int offset, 328int len)329 {330if ((index < 0) || (index > length()))331throw new StringIndexOutOfBoundsException(index);332if ((offset < 0) || (len < 0) || (offset > str.length - len))333throw new StringIndexOutOfBoundsException(334 "offset " + offset + ", len " + len + ", str.length "337 System.arraycopy(value, index, value, index + len, count - index); 338 System.arraycopy(str, offset, value, index, len);339 count += len;340return this;341 }342343public AbstractStringBuilder insert(int offset, Object obj) {344return insert(offset, String.valueOf(obj));345 }346347public AbstractStringBuilder insert(int offset, String str) {348if ((offset < 0) || (offset > length()))349throw new StringIndexOutOfBoundsException(offset);350if (str == null)351 str = "null";352int len = str.length();353 ensureCapacityInternal(count + len);354 System.arraycopy(value, offset, value, offset + len, count - offset); 355 str.getChars(value, offset);356 count += len;357return this;358 }359360public AbstractStringBuilder insert(int offset, char[] str) {361if ((offset < 0) || (offset > length()))362throw new StringIndexOutOfBoundsException(offset);363int len = str.length;364 ensureCapacityInternal(count + len);365 System.arraycopy(value, offset, value, offset + len, count - offset); 366 System.arraycopy(str, 0, value, offset, len);367 count += len;368return this;369 }370371public AbstractStringBuilder insert(int dstOffset, CharSequence s) { 372if (s == null)373 s = "null";374if (s instanceof String)375return this.insert(dstOffset, (String)s);376return this.insert(dstOffset, s, 0, s.length());377 }378379public AbstractStringBuilder insert(int dstOffset, CharSequence s, 380int start, int end) {381if (s == null)382 s = "null";383if ((dstOffset < 0) || (dstOffset > this.length()))384throw new IndexOutOfBoundsException("dstOffset "+dstOffset); 385if ((start < 0) || (end < 0) || (start > end) || (end > s.length()))386throw new IndexOutOfBoundsException(387 "start " + start + ", end " + end + ", s.length() "388 + s.length());389int len = end - start;390 ensureCapacityInternal(count + len);391 System.arraycopy(value, dstOffset, value, dstOffset + len,392 count - dstOffset);393for (int i=start; i<end; i++)394 value[dstOffset++] = s.charAt(i);395 count += len;396return this;397 }398399public AbstractStringBuilder insert(int offset, boolean b) {400return insert(offset, String.valueOf(b));401 }402403public AbstractStringBuilder insert(int offset, char c) {404 ensureCapacityInternal(count + 1);405 System.arraycopy(value, offset, value, offset + 1, count - offset); 406 value[offset] = c;407 count += 1;408return this;409 }410411public AbstractStringBuilder insert(int offset, int i) {412return insert(offset, String.valueOf(i));413 }414415public AbstractStringBuilder insert(int offset, long l) {416return insert(offset, String.valueOf(l));417 }418421 }422423public AbstractStringBuilder insert(int offset, double d) {424return insert(offset, String.valueOf(d));425 }426427public int indexOf(String str) {428return indexOf(str, 0);429 }430431public int indexOf(String str, int fromIndex) {432return String.indexOf(value, 0, count,433 str.toCharArray(), 0, str.length(), fromIndex);434 }435436public int lastIndexOf(String str) {437return lastIndexOf(str, count);438 }439440public int lastIndexOf(String str, int fromIndex) {441return stIndexOf(value, 0, count,442 str.toCharArray(), 0, str.length(), fromIndex);443 }444445public AbstractStringBuilder reverse() {446boolean hasSurrogate = false;447int n = count - 1;448for (int j = (n-1) >> 1; j >= 0; --j) {449char temp = value[j];450char temp2 = value[n - j];451if (!hasSurrogate) {452 hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE) 453 || (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE);454 }455 value[j] = temp2;456 value[n - j] = temp;457 }458if (hasSurrogate) {459// Reverse back all valid surrogate pairs460for (int i = 0; i < count - 1; i++) {461char c2 = value[i];462if (Character.isLowSurrogate(c2)) {463char c1 = value[i + 1];464if (Character.isHighSurrogate(c1)) {465 value[i++] = c1;466 value[i] = c2;467 }468 }469 }470 }471return this;472 }473474public abstract String toString();475476final char[] getValue() {477return value;478 }479 }View CodeStringBuilder源码(基于jdk1.7.40)1package ng;23public final class StringBuilder4extends AbstractStringBuilder5implements java.io.Serializable, CharSequence {67static final long serialVersionUID = 4383685877147921099L;89// 构造函数。