Karena ketika melihat kode sumber StringBuffer dan StringBuilder, ditemukan bahwa keduanya mewarisi AbstractStringBuilder, dan banyak metode adalah metode dari kelas induk AbstractStringBuilder secara langsung, jadi saya memutuskan untuk melihat kode sumber AbstractStringBuilder terlebih dahulu, dan kemudian melihat StringBuffer dan StringBuilder.
Lokasi: dalam paket java.lang
Pernyataan: Abstrak Kelas AbstrakStringBuilderImplements Ditambahkan, Charsequence
Kelas AbstractStringBuilder memiliki modifikasi abstrak, yang menunjukkan bahwa itu tidak dapat dipakai.
Kelas AbstractStringBuilder memiliki dua subclass: StringBuilder dan StringBuffer.
Bidang
/*** Nilainya digunakan untuk penyimpanan karakter. */ nilai char []; /*** Hitungannya adalah jumlah karakter yang digunakan. */ jumlah int;
Konstruktor
1. Konstruktor tanpa parameter
AbstractStringBuilder () {}2. Saat membuat objek kelas implementasi AbstractStringBuilder, tentukan ukuran buffer untuk kapasitas.
AbstractStringBuilder (int kapasitas) {value = new char [kapasitas]; }Ketika Subclass StringBuilder atau StringBuffer dipakai, konstruktor ini dipanggil dalam konstruktor.
Perluas kapasitas
void expandCapacity(int minimumCapacity)
Metode ini memiliki izin akses paket, dan beberapa metode di kelas akan memanggil metode ini untuk memperluas kapasitas ketika kapasitas tidak cukup.
Kode Sumber:
void ExpandCapacity (int minimumCapacity) {int newCapacity = (value.length + 1) * 2; if (newcapacity <0) {newCapacity = integer.max_value; } else if (minimumCapacity> newCapacity) {newCapacity = minimumCapacity; } value = arrays.copyof (value, newcapacity); }Tambahkan panjang buffer dengan 1 dengan 2 ke variabel newcapacity, kemudian bandingkan nilai ini dengan nilai yang ditentukan, dan tentukan nilai yang lebih besar sebagai kapasitas baru buffer; Kemudian hubungi metode copyof dari kelas array, yang membuat array baru dan kemudian salin semua karakter dalam array asli ke dalam array baru.
Ensurecapacity (int minimum kapasitas)
Public Void Ensurecapacity (int minimumcapacity)
Pastikan kapasitasnya setidaknya sama dengan nilai minimum yang ditentukan. Jika kapasitas saat ini kurang dari nilai yang ditentukan, array baru dibuat, dan kapasitas array baru adalah dua kali nilai yang ditentukan ditambah 2; Jika kapasitas saat ini tidak kurang dari nilai yang ditentukan, tidak ada pemrosesan yang dilakukan secara langsung.
Kode Sumber:
public void EnsureCapacity (int minimumCapacity) {if (minimumCapacity> value.length) {ExpandCapacity (minimumCapacity); }}tes:
StringBuffer S = StringBuffer baru (); System.out.println ("Kapasitas:" + S.Capacity ()); // Kapasitas: 16 S.SureCapacity (10); System.out.println ("Kapasitas:" + S.Capacity ()); // Kapasitas: 16 S.SureCapacity (30); System.out.println ("Kapasitas:" + S.Capacity ()); // Kapasitas: 34 S.SureCapacity (80); System.out.println ("Kapasitas:" + S.Capacity ()); // Kapasitas: 80metode
Metode codepointat diimplementasikan menggunakan karakter.codepointatImpl (nilai, indeks, hitungan)
public int codepointat (int index) {if ((index <0) || (index> = count)) {throw stringIndExoutOfBoundSException (index); } return character.codepointatImpl (value, index, count); }Metode GetChars diimplementasikan menggunakan metode System.ArrayCopy ()
public void getChars (int srcbegin, int srcend, char [] dst, int dstbegin) {if (srcbegin <0) melempar stringIndExoutOfBoundsException baru (srcbegin); if ((srcend <0) || (srcend> count)) lempar stringIndExoutOfBoundsException baru (srcend); if (srcbegin> srcend) melempar stringIndexOutOfBoundSException baru ("srcbegin> srcend"); System.ArrayCopy (Nilai, Srcbegin, DST, DSTBegin, Srcend - Srcbegin); }Metode Append melibatkan metode EnsureCapacityInternal () dan metode getChars () untuk mengimplementasikannya
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; }Arrays.copyof () digunakan untuk menerapkan
void expandcapacity (int 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); }Arrays.fill (value, count, newlength, '/0'); Salin antar string
public void setLength (int newLength) {if (newLength <0) melempar stringIndExoutOfBoundsException baru (newLength); EnsureCapacityinternal (Newlength); if (count <newLength) {arrays.fill (value, count, newLength, '/0'); } count = newLength; }hapus () hanya mengubah ukuran string dan tidak benar -benar menghapus string
public abstractStringBuilder delete (int start, int end) {if (start <0) lempar stringIndExoutOfBoundsException baru (start); if (end> count) end = count; if (start> end) lempar stringIndExoutOfBoundSexception () baru; int len = end - mulai; if (len> 0) {System.ArrayCopy (Nilai, Mulai+Len, Nilai, Mulai, Count-end); hitung -= len; } kembalikan ini; }Belajar menggunakan metode System.ArrayCopy () secara fleksibel
Publik AbstractStringBuilder Insert (int index, char [] str, int offset, int len) {if ((index <) || (index> length ())) Lempar stringIndExoutOfBoundsException baru (index); if ((offset <0) || (len <0) || (offset> str.length - len)) melempar stringIndexOutOfBoundSException baru ("offset" + offset + ", len" + len + ", str.length" + str.length); Ensurecapacityinternal (Count + Len); System.ArrayCopy (Nilai, Indeks, Nilai, Indeks + Len, Hitung - Indeks); System.ArrayCopy (STR, Offset, Value, Index, Len); hitung += len; kembalikan ini; }Meringkaskan
Di atas adalah semua konten dari artikel ini tentang interpretasi terperinci dari kode sumber kode sumber kelas abstractStringBuilder. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!