[源碼]String StringBuffer StringBudlider(2)StringBuffer StringBuilder源碼分析

來源:互聯網
上載者:User

標籤:false   reverse   into   style   區別   offset   位置   cat   osi   

  縱騎橫飛 章仕烜  昨天比較忙 今天把StringBuffer StringBulider的源碼分析 獻上  在講 StringBuffer StringBuilder 之前 ,我們先看一下 它們共同的老祖宗 AbstractStringBuilder 這是 StringBuilder StringBuffer 的根基再看看 這兩個實作類別 裡邊有什麼 很顯然,這兩個東西什麼都沒寫吧 我們看看 另一個門派的 String 看出 為什麼 我們說String 對象是不可變的 StringBuilder StringBuffer 可變的原因了嗎? 就是 上面 的 三個final 對吧 好 那麼我們都知道了 String 是不可變的 ,也就是說 就像 一次性紙杯,你如果想要50ml那就拿50ml的杯子 想100ml 就拿 100ml的杯子 不需要換杯子然後就是 一個問題: StringBuffer StringBuilder 底層是一堆數組 它們是如何擴容的?  所謂 容量 就是 底層數組的實際長度 ,比如說 ArrayList 底層當然是個array這個集合 裡邊加的東西 不是不限個嘛 怎麼做到這種效果 ,用的就是 CAPACITY 大家需要知道 擴容的3個問題:  1. 預設 容量是多少? 2. 如何擴容 ? 3. 和 length 是什麼區別 ?  再有一個問題 StringBuffer 為什麼是安全執行緒的?   這是簡略版 的 StringBuffer 大家可以看一下
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{static final long serialVersionUID = 3388685877147921107L; public StringBuffer() {super(16); } public StringBuffer(int capacity) {super(capacity);} public StringBuffer(String str) {super(str.length() + 16); append(str);} /***這邊也是一樣的*/public StringBuffer(CharSequence seq) {this(seq.length() + 16);append(seq);} public synchronized int length() {return count;} public synchronized int capacity() {return value.length;}/*** jdk 直接對外提供的 擴容 方法*/public synchronized void ensureCapacity(int minimumCapacity) {if (minimumCapacity > value.length) {expandCapacity(minimumCapacity);}}/*** trim to actual size 也就是 array.length ---> count*/public synchronized void trimToSize() {super.trimToSize();} public synchronized void setLength(int newLength) {super.setLength(newLength);}public synchronized char charAt(int index) {if ((index < 0) || (index >= count))throw new StringIndexOutOfBoundsException(index);return value[index];}  public synchronized int codePointAt(int index) {return super.codePointAt(index);} public synchronized int codePointBefore(int index) {return super.codePointBefore(index);}public synchronized int codePointCount(int beginIndex, int endIndex) {return super.codePointCount(beginIndex, endIndex);}public synchronized int offsetByCodePoints(int index, int codePointOffset) {return super.offsetByCodePoints(index, codePointOffset);}  public synchronized void getChars(int srcBegin, int srcEnd, char dst[],int dstBegin){super.getChars(srcBegin, srcEnd, dst, dstBegin);}  public synchronized void setCharAt(int index, char ch) {if ((index < 0) || (index >= count))throw new StringIndexOutOfBoundsException(index);value[index] = ch;} /*** append*/public synchronized StringBuffer append(Object obj) {super.append(String.valueOf(obj));return this;} public synchronized StringBuffer appendCodePoint(int codePoint) {super.appendCodePoint(codePoint);return this;}   public synchronized StringBuffer delete(int start, int end) {super.delete(start, end);return this;}  public synchronized StringBuffer replace(int start, int end, String str) {super.replace(start, end, str);return this;}   public synchronized CharSequence subSequence(int start, int end) {return super.substring(start, end);} public synchronized String substring(int start, int end) {return super.substring(start, end);} public synchronized StringBuffer insert(int index, char str[], int offset,int len){super.insert(index, str, offset, len);return this;}  public synchronized StringBuffer insert(int offset, String str) {super.insert(offset, str);return this;} public synchronized StringBuffer insert(int offset, char str[]) {super.insert(offset, str);return this;}  public synchronized StringBuffer insert(int dstOffset, CharSequence s,int start, int end){super.insert(dstOffset, s, start, end);return this;}/*** 預設檢索起始位置 為 0*/public int indexOf(String str) {return indexOf(str, 0);} public synchronized int indexOf(String str, int fromIndex) {return String.indexOf(value, 0, count,str.toCharArray(), 0, str.length(), fromIndex);}  public int lastIndexOf(String str) {// Note, synchronization achieved via other invocationsreturn lastIndexOf(str, count);} public synchronized int lastIndexOf(String str, int fromIndex) {return String.lastIndexOf(value, 0, count,str.toCharArray(), 0, str.length(), fromIndex);} /** * reverse 和 replace 這些和 順序 有關的方法  * 在 Collections 裡邊也有 只不過 只支援 List 實作類別(與順序相關) */public synchronized StringBuffer reverse() {super.reverse();return this;} public synchronized String toString() {return new String(value, 0, count);}  private static final java.io.ObjectStreamField[] serialPersistentFields ={new java.io.ObjectStreamField("value", char[].class),new java.io.ObjectStreamField("count", Integer.TYPE),new java.io.ObjectStreamField("shared", Boolean.TYPE),}; private synchronized void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException {java.io.ObjectOutputStream.PutField fields = s.putFields();fields.put("value", value);fields.put("count", count);fields.put("shared", false);s.writeFields();}  private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {java.io.ObjectInputStream.GetField fields = s.readFields();value = (char[])fields.get("value", null);count = (int)fields.get("count", 0);}}

 


StringBuilder 相對於 StringBuffer 就是沒有 加鎖         

[源碼]String StringBuffer StringBudlider(2)StringBuffer StringBuilder源碼分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.