StringBuilder dan StringBuffer adalah dua kelas yang umum digunakan untuk memanipulasi string. Seperti yang kita semua ketahui, StringBuilder adalah Thread-Insecure, sedangkan StringBuffer aman. Yang pertama ditambahkan oleh JDK1.5, dan yang terakhir tersedia di JDK1.0. Mari kita analisis implementasi internal mereka di bawah ini.
1. Hubungan warisan
Public Final Class StringBufferExtends AbstractStringBuilderImplements java.io.serializable, charsequencePublic kelas akhir stringBuilderextends abstractStringBuilderImplements java.io.serializable, charsequence
Dapat dilihat bahwa hubungan warisan antara kedua kelas persis sama. Serializable adalah bendera serial. Antarmuka charsequence termasuk metode chARAT (), panjang (), selanjutnya (), dan tostring (). Kelas string juga mengimplementasikan antarmuka ini. Fokusnya di sini adalah pada kelas abstrak AbstractStringBuilder, yang merangkum implementasi sebagian besar operasi StringBuilder dan StringBuffer.
2. AbstractStringBuilder
1. Variabel dan metode konstruksi
char [] value; int count; abstractStringBuilder () {} abstractStringBuilder (int kapasitas) {value = new char [kapasitas];}AbstractStringBuilder menggunakan array char [] untuk menghemat string, dan metode kapasitas awal dapat ditentukan selama konstruksi.
2. Perluas kapasitas
public void Ensurecapacity (int minimumCapacity) {if (minimumCapacity> 0) EnsureCapacityInternal (minimumcapacity);} private void ensurecapacityintternal (int minimumcapacity) {// overflow -conscicy code if (minimumcapacity - value.length> 0) Expandicity (minimumcapacity (minimumcapacity - value. minimumCapacity) {int newCapacity = value.length * 2 + 2; if (newcapacity - minimumcapacity <0) newCapacity = minimumcapacity; if (newcapacity <0) {if (minimumcapacity <0) // overflow new outofmemoryError (); newCapacity = integer.max_value; } value = arrays.copyof (value, newcapacity);}Metode ekspansi pada akhirnya diimplementasikan oleh ExpandCapacity (). Dalam metode ini, kapasitas pertama kali diperluas ke kapasitas asli ditambah 2. Jika masih kurang dari kapasitas yang ditentukan saat ini, maka kapasitas baru diatur ke kapasitas minimum. Kemudian tentukan apakah itu meluap. Jika meluap, atur kapasitas ke integer.max_value. Akhirnya, menyalin nilai nilai jelas merupakan operasi yang memakan waktu.
3. Metode append ()
public abstractStringBuilder append (string str) {if (str == null) return appendNull (); int len = str.length (); Ensurecapacityinternal (Count + Len); str.getchars (0, len, nilai, hitungan); hitung += len; kembalikan ini; }append () adalah metode yang paling umum digunakan, ia memiliki banyak bentuk kelebihan beban. Di atas adalah salah satunya, yang digunakan untuk menambahkan string. Jika STR adalah NULL, metode appendNull () akan dipanggil. Metode ini sebenarnya menambahkan karakter seperti 'n', 'u', 'l', dan 'l'. Jika bukan nol, pertama -tama kembangkan kapasitasnya, lalu hubungi metode getchars () untuk menambahkan STR ke akhir nilai. Akhirnya, objek itu sendiri dikembalikan, jadi append () dapat dipanggil terus menerus.
3. StringBuilder
AbstractStringBuilder telah menerapkan sebagian besar metode yang diperlukan, dan StringBuilder dan StringBuffer hanya perlu dipanggil. Mari kita lihat implementasi StringBuilder.
1. Konstruktor
public stringBuilder () {super (16);} public stringBuilder (int kapasitas) {super (kapasitas);} public stringBuilder (string str) {super (str.length () + 16); append (str);} public StringBuilder (CharSequence seq) {this (seq.length () + 16); append (seq);}Seperti yang dapat dilihat, ukuran kapasitas default StringBuilder adalah 16. Tentu saja, Anda juga dapat menentukan kapasitas awal, atau menetapkan nilai awal ke objek StringBuilder dalam urutan karakter yang ada.
2. Metode append ()
public StringBuilder append (string str) {super.append (str); kembalikan ini;} public StringBuilder append (CharSequence s) {super.append (s); kembalikan ini;}Ada banyak metode kelebihan beban untuk append (), dan berikut adalah dua di antaranya. Jelas, berikut adalah metode dalam kelas induk AbstractStringBuilder yang disebut secara langsung.
3. Tostring ()
Public String ToString () {// Buat salinan, jangan bagikan array return string baru (value, 0, count);}Metode ToString () mengembalikan objek string baru yang tidak berbagi memori dengan objek asli. Faktanya, hal yang sama berlaku untuk metode substring () dalam AbstractStringBuilder.
4. Sringbuffer
StiringBuffer mirip dengan StringBuilder, tetapi untuk mencapai sinkronisasi, banyak metode menggunakan modifikasi lsynchronized, seperti metode berikut:
Panjang int tersinkronisasi publik () {return count;} public Synchronized StringBuffer append (string str) {toStringCache = null; super.append (str); kembalikan ini;} public disinkronkan void setLength (int newLength) {toStringcache = null; super.setLength (newLength);} Seperti yang Anda lihat, disinkronkan memang ditambahkan di depan metode.
Selain itu, ada juga variabel ToStringcache dalam metode append () dan setLength () di atas. Variabel ini digunakan untuk cache terakhir dari metode tostring (). Setiap kali StringBuffer dimodifikasi, variabel ini akan ditugaskan ke NULL. Tostring dari StringBuffer adalah sebagai berikut:
string sinkronisasi publik ToString () {if (toStringcache == null) {toStringcache = arrays.copyofrange (value, 0, count); } return string baru (ToStringCache, true);}Dalam metode ini, jika tostringcache adalah nol, di -cache terlebih dahulu. Objek string final yang dikembalikan sedikit berbeda, dan konstruktor ini memiliki parameter yang benar. Temukan kode sumber string dan lihat:
String (nilai char [], boolean share) {// asert share: "unshared not sharted"; this.value = value;}Ternyata objek string yang dibangun oleh metode konstruksi ini tidak benar -benar menyalin string, tetapi hanya menunjukkan nilai ke parameter konstruksi, yaitu menghemat waktu menyalin elemen. Namun, konstruktor ini memiliki izin akses paket dan tidak dapat dipanggil secara umum.
Meringkaskan
Di atas adalah semua tentang artikel ini. Saya harap akan sangat membantu bagi semua orang untuk mempelajari dua kelas string operasi yang umum digunakan di Java, StringBuilder dan StringBuffer.