JDK源碼解析之 Java.lang.StringBuffer

StringBuffer類表示一個可變的字符序列。StringBuffer的API與StringBuilder互相兼容,但是StringBuffer是線程安全的。在可能的情況下,建議優先使用StringBuilder,因為在大多數實現中它比StringBuffer更快。

一、類定義

public final class StringBufferextends AbstractStringBuilderimplements java.io.Serializable, CharSequence
{...
}

StringBuffer類被 final 所修飾,因此不能被繼承。

StringBuffer類繼承于 AbstractStringBuilder類。實際上,AbstractStringBuilder類具體實現了可變字符序列的一系列操作,比如:append()、insert()、delete()、replace()、charAt()方法等。值得一提的是,StringBuilder也是繼承于AbstractStringBuilder類。

StringBuffer類實現了2個接口:

  • Serializable 序列化接口,表示對象可以被序列化。
  • CharSequence 字符序列接口,提供了幾個對字符序列進行只讀訪問的方法,比如:length()、charAt()、subSequence()、toString()方法等。

二、成員變量

private transient char[] toStringCache;// AbstractStringBuilder.javachar[] value;int count;
  • value、count這兩個變量是繼承自父類

  • toStringCache 用來緩存toString()方法返回的最近一次的value數組中的字符。當修改StringBuffer對象時會被清除。

三、構造方法

//默認構造方法設置了value數組的初始容量為16。
public StringBuffer() {super(16);
}
//設置了value數組的初始容量為指定的大小。
public StringBuffer(int capacity) {super(capacity);
}
//接受一個String對象作為參數,設置了value數組的初始容量為String對象的長度+16,并把String對象中的字符添加到value數組中。
public StringBuffer(String str) {super(str.length() + 16);append(str);
}
//接受一個CharSequence對象作為參數,設置了value數組的初始容量為CharSequence對象的長度+16,并把CharSequence對象中的字符添加到value數組中。
public StringBuffer(CharSequence seq) {this(seq.length() + 16);append(seq);
}// AbstractStringBuilder.java
AbstractStringBuilder(int capacity) {value = new char[capacity];
}

StringBuffer類提供了4個構造方法。構造方法主要完成了對value數組的初始化。

四、普通方法

StringBuilder實現了AbstractStringBuilder和CharSequence,他的方法都來自于這兩個類,絕大部分都是通過super來調用的。

4.1、append()方法
@Override
public synchronized StringBuffer append(boolean b) {toStringCache = null;super.append(b);return this;
}// AbstractStringBuilder.java
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;
}    @Override
public synchronized StringBuffer append(String str) {toStringCache = null;super.append(str);return this;
}// AbstractStringBuilder.java
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;
}    

調用了父類AbstractStringBuilder類中對應的方法。最后,append()方法返回了StringBuffer對象自身。

append()方法將指定參數類型的字符串表示形式追加到字符序列的末尾。它可以接受boolean、char、char[]、CharSequence、double、float、int、long、Object、String、StringBuffer這些類型的參數。這些方法最終都,以便用戶可以鏈式調用StringBuilder類中的方法。

AbstractStringBuilder類的各個append()方法大同小異。append()方法在追加字符到value數組中之前都會調用ensureCapacityInternal()方法來確保value數組有足夠的容量,然后才把字符追加到value數組中。

4.2、toString()方法
@Override
public String toString() {// Create a copy, don't share the arrayreturn new String(value, 0, count);
}
4.3、writeObject和readObject
    /*** Save the state of the {@code StringBuilder} instance to a stream* (that is, serialize it).** @serialData the number of characters currently stored in the string*             builder ({@code int}), followed by the characters in the*             string builder ({@code char[]}).   The length of the*             {@code char} array may be greater than the number of*             characters currently stored in the string builder, in which*             case extra characters are ignored.*/private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException {s.defaultWriteObject();s.writeInt(count);s.writeObject(value);}/*** readObject is called to restore the state of the StringBuffer from* a stream.*/private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {s.defaultReadObject();count = s.readInt();value = (char[]) s.readObject();}

實現自Serializable接口后,可定制的序列化過程

4.4、toStringCache()

StringBuffer中有一個toStringCache 就像它的名字一樣,toString()方法的cache

簡言之就是緩存toString方法的,每次調用toString會檢查這個字段,如果不為null將會使用它進行對象創建

如果為null 將會給他初始化賦值,也就是緩存,當調用其他的任何方法改變StringBuffer時,就會把toStringCache進行清空

五、總結

StringBuffer類將所有操作字符序列的方法都添加了 synchronized 關鍵字來修飾,因此,StringBuffer類是線程安全的。

  • 他是可變的字符序列的抽象模型,定義了可變字符序列的公共行為

  • 它是一個抽象類,針對一些操作提供了默認的實現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535788.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535788.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535788.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

redo和undo

這是在網上看到的對redo和undo的探討: 1. redo 記錄所有做過的事情,用于恢復 undo 記錄事務的前鏡相,用于回滾2. redo,恢復數據庫時,按照重做日志文件來恢復你之前的操作 undo,撤消你做過的操作&#xff0…

JDK源碼解析之 Java.lang.StringBuilder

StringBuilder類表示一個可變的字符序列。StringBuilder的API與StringBuffer互相兼容,但是StringBuilder是非線程安全的,在大多數實現中它比StringBuffer更快。 一、類定義 public final class StringBufferextends AbstractStringBuilderimplements ja…

從映射觀點看索引

信息檢索主要有“檢”與“索(辦手續)”兩個動作。在圖書館借書時,一般而言, 找書的時間比辦理手續的時間長得多,因而縮短檢查時間是提高效率的關鍵。數據庫中檢 索信息也與此類似。 在沒有索引文件時,DBM…

JDK源碼解析之 Java.lang.Boolean

Boolean 類是將 boolean 基本類型進行包裝。類型為 Boolean 的對象包含一個單一屬性 value,其類型為 boolean。 此外還提供了許多將 boolean 轉換為 String、String 轉換為 boolean,以及其他一些方法。 一、類定義 public final class Boolean implemen…

MYSQL的集群的安裝與配置(mysql-5.1.21)

具體安裝與配置:1)準備工作:6臺機器,IP地址分別為192.168.0.(231-236)MGM節點:192.168.0.231(232)SQL 節點:192.168.0.233-234NDBD 節點:192.168.0.235-236系統都是REDHA…

JDK源碼解析之 Java.lang.Byte

byte,即字節,由8位的二進制組成。在Java中,byte類型的數據是8位帶符號的二進制數,以二進制補碼表示的整數 取值范圍:默認值為0,最小值為-128(-27);最大值是127(27-1) Byt…

在命令行模式下管理SELinux

作者: Oslad.com (原創!轉載請注明出處) 2006-07-14 在 GUI 圖形界面模式下,要更改 SELinux 的策略使用方式,只需依次點擊“應用程序”,“系統設置”,“安全級別”;然后在“安全級別配置”對…

JDK源碼解析之 Java.lang.Double

Double類是原始類型double的包裝類,它包含若干有效處理double值的方法,如將其轉換為字符串表示形式,反之亦然。Double類的對象可以包含一個double值。 Double類包裝原始類型的值 double中的對象。類型的對象 Double包含一個類型為的字段 doub…

網頁搜索幫助-禁止搜索引擎收錄的方法

什么是robots.txt文件?搜索引擎使用spider程序自動訪問互聯網上的網頁并獲取網頁信息。spider在訪問一個網站時,會首先會檢查該網站的根域下是否有一個叫做robots.txt的純文本文件。您可以在您的網站中創建一個純文本文件robots.txt,在文件中聲明該網站…

JDK源碼解析之 Java.lang.Float

Float類是原始類型float的包裝類&#xff0c;它包含若干有效處理浮點值的方法&#xff0c;如將其轉換為字符串表示形式&#xff0c;反之亦然。Float類的一個對象可以包含一個浮點值 一、類定義 public final class Float extends Number implements Comparable<Float> {…

FTP兩種工作模式:主動模式(Active FTP)和被動模式(Passive FTP)

在主動模式下&#xff0c;FTP客戶端隨機開啟一個大于1024的端口N向服務器的21號端口發起連接&#xff0c;然后開放N1號端口進行監聽&#xff0c;并向服務器發出PORT N 1命令。服務器接收到命令后&#xff0c;會用其本地的FTP數據端口&#xff08;通常是20&#xff09;來連接客戶…

JDK源碼解析之 java.lang.Integer

teger 基本數據類型int 的包裝類 Integer 類型的對象包含一個 int 類型的字段 一、類定義 public final class Integer extends Number implements Comparable<Integer>{}類被聲明為final的,表示不能被繼承;繼承了Number抽象類,可以用于數字類型的一系列轉換;實現了Comp…

Loadrunner的基本概念

1)vuser_init(only one &#xff0c;重復執行腳本的時候&#xff0c;此部分只會執行一次 ) %G< rJc*P 2)action( 一個或者多個 , 重復執行腳本的時候&#xff0c;只有該部分會按重復的次數重復執行 ) z*Xfjy(Mj 3)vuser_end(only one, 重復執行腳本的時候&#xff0c;此…

JDK源碼解析之 java.lang.Long

Long 與Integer 是數值類型中使用頻率最高的兩個,也是提供支持方法最多的兩個 他們提供出來的方法功能也是高度的相似 一、類定義 public final class Long extends Number implements Comparable<Long> {}類被聲明為final的,表示不能被繼承;繼承了Number抽象類,可以用于…

sed教程入門與實例練習(一)

UNIX 世界中有很多文本編輯器可供我們選擇。思考一下 — vi、emacs 和 jed 以及很多其它工具都會浮現在腦海中。我們都有自己已逐漸了解并且喜愛的編輯器&#xff08;以及我們喜愛的組合鍵&#xff09;。有了可信賴的編輯器&#xff0c;我們可以輕松處理任何數量與 UNIX 有關的…

JDK源碼解析之 Java.lang.Short

Short類是基本類型short 的包裝類&#xff0c;它包含幾種有效處理短值的方法&#xff0c;如將其轉換為字符串表示形式&#xff0c;反之亦然。Short類的對象可以包含單個短值。 一、類定義 public final class Short extends Number implements Comparable<Short> {}類被…

sed教程入門與實例練習(二)

讓我們看一下 sed 最有用的命令之一&#xff0c;替換命令。使用該命令&#xff0c;可以將特定字符串或匹配的規則表達式用另一個字符串替換。下面是該命令最基本用法的示例&#xff1a; $ sed -e ’s/foo/bar/’ myfile.txt上面的命令將 myfile.txt 中每行第一次出現的 ‘foo’…

Oracle GoldenGate簡介

一、什么是Oracle GoldenGate&#xff1f; Oracle GoldenGate是用于實時數據集成和復制的綜合軟件包。它支持高可用性解決方案&#xff0c;實時數據集成&#xff0c;事務性更改數據捕獲&#xff0c;數據復制&#xff0c;轉換以及運營和分析企業系統之間的驗證。 使用Oracle G…

sed教程入門與實例練習(三)

在第二篇 sed 文章中&#xff0c;我提供了一些示例來演示 sed 的工作原理&#xff0c;但是它們當中很少有示例能實際做特別有用的事。在這篇 sed 系列的最后文章中&#xff0c;我要改變那種方式&#xff0c;并使用 sed 來做實際的事。我將為您顯示幾個示例&#xff0c;它們不僅…

Oracle GoldenGate微服務架構

Oracle GoldenGate支持兩種架構&#xff0c;經典架構和微服務架構&#xff08;MA&#xff09;。 可以出于以下目的配置Oracle GoldenGate&#xff1a; 從一個數據庫中靜態提取數據記錄&#xff0c;并將這些記錄加載到另一個數據庫中。連續提取和復制事務性數據處理語言&#…