07 java.lang.StringBuilder
2015-08-26 22:43
525 查看
StringBuilder
2015.01.15 By 970655147
如果大家有过字符串拼接的经验的话, 可能对于这个类不会陌生, 因为直接使用String拼接多个字符串的话, 开销略大, 那么这种场景下StringBuilder/ StringBuffer, 就闪亮登场了
start ->
声明
, 大家可以看看注释/** * A mutable sequence of characters. This class provides an API compatible * with <code>StringBuffer</code>, but with no guarantee of synchronization. * This class is designed for use as a drop-in replacement for * <code>StringBuffer</code> in places where the string buffer was being * used by a single thread (as is generally the case). Where possible, * it is recommended that this class be used in preference to * <code>StringBuffer</code> as it will be faster under most implementations. * * <p>The principal operations on a <code>StringBuilder</code> are the * <code>append</code> and <code>insert</code> methods, which are * overloaded so as to accept data of any type. Each effectively * converts a given datum to a string and then appends or inserts the * characters of that string to the string builder. The * <code>append</code> method always adds these characters at the end * of the builder; the <code>insert</code> method adds the characters at * a specified point. * <p> * For example, if <code>z</code> refers to a string builder object * whose current contents are "<code>start</code>", then * the method call <code>z.append("le")</code> would cause the string * builder to contain "<code>startle</code>", whereas * <code>z.insert(4, "le")</code> would alter the string builder to * contain "<code>starlet</code>". * <p> * In general, if sb refers to an instance of a <code>StringBuilder</code>, * then <code>sb.append(x)</code> has the same effect as * <code>sb.insert(sb.length(), x)</code>. * * Every string builder has a capacity. As long as the length of the * character sequence contained in the string builder does not exceed * the capacity, it is not necessary to allocate a new internal * buffer. If the internal buffer overflows, it is automatically made larger. * * <p>Instances of <code>StringBuilder</code> are not safe for * use by multiple threads. If such synchronization is required then it is * recommended that {@link java.lang.StringBuffer} be used. * * @author Michael McCloskey * @see java.lang.StringBuffer * @see java.lang.String * @since 1.5 */ public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
StringBuilder. append(Object/ String/ StringBuilder/ CharSequence obj)
public StringBuilder append(Object obj) { return append(String.valueOf(obj)); } public StringBuilder append(String str) { super.append(str); return this; } public StringBuilder append(StringBuffer sb) { super.append(sb); return this; } public StringBuilder append(CharSequence s) { if (s == null) s = "null"; if (s instanceof String) return this.append((String)s); if (s instanceof StringBuffer) return this.append((StringBuffer)s); if (s instanceof StringBuilder) return this.append((StringBuilder)s); return this.append(s, 0, s.length()); } public StringBuilder append(CharSequence s, int start, int end) { super.append(s, start, end); return this; } public AbstractStringBuilder append(CharSequence s, int start, int end) { if (s == null) s = "null"; if ((start < 0) || (start > end) || (end > s.length())) throw new IndexOutOfBoundsException( "start " + start + ", end " + end + ", s.length() " + s.length()); int len = end - start; // 确保空间足够 ensureCapacityInternal(count + len); // 拼接数据 for (int i = start, j = count; i < end; i++, j++) value[j] = s.charAt(i); count += len; return this; } public AbstractStringBuilder append(String str) { if (str == null) str = "null"; int len = str.length(); // 确保value能存放append str 不够则扩容 ensureCapacityInternal(count + len); // 将str的字符拼接到value后面 str.getChars(0, len, value, count); count += len; return this; } private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code // 如果需求的minCapacity大于value.length 则扩容 if (minimumCapacity - value.length > 0) expandCapacity(minimumCapacity); } void expandCapacity(int minimumCapacity) { // 默认的扩容机制 int newCapacity = value.length * 2 + 2; // 如果默认的扩容小了 则扩大至minCapacity if (newCapacity - minimumCapacity < 0) newCapacity = minimumCapacity; if (newCapacity < 0) { if (minimumCapacity < 0) // overflow throw new OutOfMemoryError(); newCapacity = Integer.MAX_VALUE; } // 拷贝value的数据到新的Array中 value = Arrays.copyOf(value, newCapacity); }
StringBuilder. append(char[] str)
public StringBuilder append(char[] str) { super.append(str); return this; } public AbstractStringBuilder append(char[] str) { int len = str.length; // 确保空间,拼接数据 ensureCapacityInternal(count + len); System.arraycopy(str, 0, value, count, len); count += len; return this; }
StringBuilder. append(char[] str, int offset, int len)
public StringBuilder append(char[] str, int offset, int len) { super.append(str, offset, len); return this; } public AbstractStringBuilder append(char str[], int offset, int len) { if (len > 0) // let arraycopy report AIOOBE for len < 0 ensureCapacityInternal(count + len); System.arraycopy(str, offset, value, count, len); count += len; return this; }
StringBuilder. appedn(boolean/ int/long// float/ double b)
public StringBuilder append(boolean b) { super.append(b); return this; } public AbstractStringBuilder append(boolean b) { if (b) { ensureCapacityInternal(count + 4); value[count++] = 't'; value[count++] = 'r'; value[count++] = 'u'; value[count++] = 'e'; } else { ensureCapacityInternal(count + 5); value[count++] = 'f'; value[count++] = 'a'; value[count++] = 'l'; value[count++] = 's'; value[count++] = 'e'; } return this; } public StringBuilder append(char c) { super.append(c); return this; } public AbstractStringBuilder append(char c) { ensureCapacityInternal(count + 1); value[count++] = c; return this; } public StringBuilder append(int i) { super.append(i); return this; } public AbstractStringBuilder append(int i) { if (i == Integer.MIN_VALUE) { append("-2147483648"); return this; } // 存放i需要的长度,负数+1(“-”) int appendedLength = (i < 0) ? Integer.stringSize(-i) + 1 : Integer.stringSize(i); int spaceNeeded = count + appendedLength; ensureCapacityInternal(spaceNeeded); // 填充i的字符数据到value Integer.getChars(i, spaceNeeded, value); count = spaceNeeded; return this; } public StringBuilder append(long lng) { super.append(lng); return this; } public AbstractStringBuilder append(long l) { if (l == Long.MIN_VALUE) { append("-9223372036854775808"); return this; } int appendedLength = (l < 0) ? Long.stringSize(-l) + 1 : Long.stringSize(l); int spaceNeeded = count + appendedLength; ensureCapacityInternal(spaceNeeded); Long.getChars(l, spaceNeeded, value); count = spaceNeeded; return this; } public StringBuilder append(float f) { super.append(f); return this; } public AbstractStringBuilder append(float f) { new FloatingDecimal(f).appendTo(this); return this; } public StringBuilder append(double d) { super.append(d); return this; } public AbstractStringBuilder append(double d) { new FloatingDecimal(d).appendTo(this); return this; }
StringBuilder. appendCodePoint(int codePoint)
public StringBuilder appendCodePoint(int codePoint) { super.appendCodePoint(codePoint); return this; } public AbstractStringBuilder appendCodePoint(int codePoint) { final int count = this.count; // 判定codePoint是否在Basic Multilingual Plane范围内,如果是的话 添加1个字符即可 if (Character.isBmpCodePoint(codePoint)) { ensureCapacityInternal(count + 1); value[count] = (char) codePoint; this.count = count + 1; // 判断codePoint是否是一个合法Unicode } else if (Character.isValidCodePoint(codePoint)) { ensureCapacityInternal(count + 2); Character.toSurrogates(codePoint, value, count); this.count = count + 2; } else { throw new IllegalArgumentException(); } return this; } public static boolean isBmpCodePoint(int codePoint) { return codePoint >>> 16 == 0; // Optimized form of: // codePoint >= MIN_VALUE && codePoint <= MAX_VALUE // We consistently use logical shift (>>>) to facilitate // additional runtime optimizations. } public static boolean isValidCodePoint(int codePoint) { // Optimized form of: // codePoint >= MIN_CODE_POINT && codePoint <= MAX_CODE_POINT int plane = codePoint >>> 16; return plane < ((MAX_CODE_POINT + 1) >>> 16); }
StringBuilder. delete(int start, int end)
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) { // 将start+len的字符移动到start处 迭代count-end次 System.arraycopy(value, start+len, value, start, count-end); count -= len; } return this; }
StringBuilder. deleteCharAt(int index)
public StringBuilder deleteCharAt(int index) { super.deleteCharAt(index); return this; } public AbstractStringBuilder deleteCharAt(int index) { if ((index < 0) || (index >= count)) throw new StringIndexOutOfBoundsException(index); // 将index+1的字符移动到index处 迭代count-index-1次 System.arraycopy(value, index+1, value, index, count-index-1); count--; return this; }
StringBuilder. replace(int start, int end, String str)
public StringBuilder replace(int start, int end, String str) { super.replace(start, end, str); return this; } public AbstractStringBuilder replace(int start, int end, String str) { if (start < 0) throw new StringIndexOutOfBoundsException(start); if (start > count) throw new StringIndexOutOfBoundsException("start > length()"); if (start > end) throw new StringIndexOutOfBoundsException("start > end"); if (end > count) end = count; int len = str.length(); int newCount = count + len - (end - start); ensureCapacityInternal(newCount); // 将index+1的字符移动到start + len处 迭代count-end次 // start –> start+len 处的空间留给str System.arraycopy(value, end, value, start + len, count - end); // 填充str的数据 start–> start+len str.getChars(value, start); count = newCount; return this; }
StringBuilder. insert(int index, char[] str, int offset,int len)
public StringBuilder insert(int index, char[] str, int offset,int len) { super.insert(index, str, offset, len); return this; } public AbstractStringBuilder insert(int index, char[] str, int offset,int len) { if ((index < 0) || (index > length())) throw new StringIndexOutOfBoundsException(index); if ((offset < 0) || (len < 0) || (offset > str.length - len)) throw new StringIndexOutOfBoundsException( "offset " + offset + ", len " + len + ", str.length " + str.length); ensureCapacityInternal(count + len); // 将index处的字符移动到index+len处 迭代count-index次 System.arraycopy(value, index, value, index + len, count - index); // 将str的字符移动到value的index处 完成插入数据 System.arraycopy(str, offset, value, index, len); count += len; return this; }
StringBuilder. insert(int offset, Object obj)
public StringBuilder insert(int offset, Object obj) { return insert(offset, String.valueOf(obj)); } 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); // 将offset处的字符移动到offset+str.length()处 迭代count-offset次 System.arraycopy(value, offset, value, offset + len, count - offset); // 填充str的字符数据 str.getChars(value, offset); count += len; return this; }
StringBuilder. insert(int offset, char[] str)
public StringBuilder insert(int offset, char[] str) { super.insert(offset, str); return this; } public AbstractStringBuilder insert(int offset, char[]/ CharSequence str) { if ((offset < 0) || (offset > length())) throw new StringIndexOutOfBoundsException(offset); int len = str.length; ensureCapacityInternal(count + len); // 将offset处的字符移动到offset+str.length()处 迭代count-offset次, 填充str的字符数据 System.arraycopy(value, offset, value, offset + len, count - offset); System.arraycopy(str, 0, value, offset, len); count += len; return this; } public StringBuilder insert(int dstOffset, CharSequence s) { if (s == null) s = "null"; if (s instanceof String) return this.insert(dstOffset, (String)s); return this.insert(dstOffset, s, 0, s.length()); } public StringBuilder insert(int dstOffset, CharSequence s, int start, int end) { super.insert(dstOffset, s, start, end); return this; } public AbstractStringBuilder insert(int dstOffset, CharSequence s, int start, int end) { if (s == null) s = "null"; if ((dstOffset < 0) || (dstOffset > this.length())) throw new IndexOutOfBoundsException("dstOffset "+dstOffset); if ((start < 0) || (end < 0) || (start > end) || (end > s.length())) throw new IndexOutOfBoundsException( "start " + start + ", end " + end + ", s.length() " + s.length()); int len = end - start; ensureCapacityInternal(count + len); // 将offset处的字符移动到offset+len处 迭代count-offset次, 填充str的字符数据 System.arraycopy(value, dstOffset, value, dstOffset + len, count - dstOffset); for (int i=start; i<end; i++) value[dstOffset++] = s.charAt(i); count += len; return this; }
StringBuilder. insert(int offset, boolean/ int/ long/ float/ double b)
public StringBuilder insert(int offset, boolean b) { super.insert(offset, b); return this; } public AbstractStringBuilder insert(int offset, boolean b) { return insert(offset, String.valueOf(b)); } public StringBuilder insert(int offset, char c) { super.insert(offset, c); return this; } public AbstractStringBuilder insert(int offset, char c) { ensureCapacityInternal(count + 1); System.arraycopy(value, offset, value, offset + 1, count - offset); value[offset] = c; count += 1; return this; } public StringBuilder insert(int offset, int i) { return insert(offset, String.valueOf(i)); } public StringBuilder insert(int offset, long l) { return insert(offset, String.valueOf(l)); } public StringBuilder insert(int offset, float f) { return insert(offset, String.valueOf(f)); } public StringBuilder insert(int offset, double d) { return insert(offset, String.valueOf(d)); }
StringBuilder. indexOf(String str)
public int indexOf(String str) { return indexOf(str, 0); } public int indexOf(String str, int fromIndex) { return String.indexOf(value, 0, count, str.toCharArray(), 0, str.length(), fromIndex); }
StringBuilder. lastIndexOf(String str)
public int lastIndexOf(String str) { return lastIndexOf(str, count); } public int lastIndexOf(String str, int fromIndex) { return String.lastIndexOf(value, 0, count, str.toCharArray(), 0, str.length(), fromIndex); }
StringBuilder. reverse()
public StringBuilder reverse() { super.reverse(); return this; } public AbstractStringBuilder reverse() { boolean hasSurrogate = false; int n = count - 1; // 逆转字符 从中间开始逆转.. for (int j = (n-1) >> 1; j >= 0; --j) { char temp = value[j]; char temp2 = value[n - j]; if (!hasSurrogate) { hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE) || (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE); } value[j] = temp2; value[n - j] = temp; } // 如果存在 surrogate pairs 则将其逆转回来 if (hasSurrogate) { // Reverse back all valid surrogate pairs for (int i = 0; i < count - 1; i++) { char c2 = value[i]; if (Character.isLowSurrogate(c2)) { char c1 = value[i + 1]; if (Character.isHighSurrogate(c1)) { value[i++] = c1; value[i] = c2; } } } } return this; }
StringBuilder.toString()
public String toString() { // Create a copy, don't share the array return new String(value, 0, count); }
->
ok, StringBuilder 到此结束了
这个类是非常常用的也是非常重要的, 建议详详细细的分析一遍 !
StringBuffer 和StringBuilder的内容基本一致, 不过每一个业务方法都加上了synchronized关键字, 保证了线程的安全
资源下载 : http://download.csdn.net/detail/u011039332/9051805
注 : 因为作者的水平有限,必然可能出现一些bug, 所以请大家指出!
相关文章推荐
- 01 java.lang.Object
- 02 java.lang.Integer
- 03 java.lang.Boolean
- 04 java.lang.Byte
- 05 java.lang.String
- 06 java.lang.AbstractStringBuilder
- java源码阅读笔记(1)- Object
- 10 java.lang.ThreadLocal
- 09 java.lang.Runtime
- 08 java.lang.ProcessBuilder
- 源码学习之ArrayList
- Closeable的作用
- UI_09 UITableView(表视图)
- UI基础:DataPersistent.沙盒
- requestAnimationFrame,Web中写动画的另一种选择
- UIViewControllerd的是使用
- Android UI设计——AutoCompleteTextView
- GUI编程笔记(java)10:GUI实现一级菜单
- 改变UITabBarItem 字体颜色