Da sich der Quellcode von StringBuffer und StringBuilder betrachtete, wurde festgestellt, dass sowohl der AbstractStringBuilder als auch viele Methoden der übergeordneten Klasse AbstractStringBuilder direkt geerbt wurden. Deshalb habe ich beschlossen, den Quellcode von AbstractStringBuilder zuerst zu betrachten und dann bei Stringbuffer und Stringbuilder zu schauen.
Ort: im Java.lang -Paket
Aussage: Abstract Class AbstractStringBuilderImplements Appendable, Charsequence
Die AbstractStringBuilder -Klasse hat eine abstrakte Modifikation, die zeigt, dass sie nicht instanziiert werden kann.
Die AbstractStringBuilder -Klasse hat zwei Unterklassen: StringBuilder und StringBuffer.
Felder
/*** Der Wert wird für den Zeichenspeicher verwendet. */ char value []; /*** Die Anzahl ist die Anzahl der verwendeten Zeichen. */ int count;
Konstruktor
1. parameterloser Konstruktor
AbstractStringBuilder () {}2. Wenn Sie ein Objekt der AbstractStringBuilder -Implementierungsklasse erstellen, geben Sie die Puffergröße in die Kapazität an.
AbstractStringBuilder (int Kapazität) {value = new char [Kapazität]; }Wenn der Subklass -StringBuilder oder StringBuffer instanziiert ist, wird dieser Konstruktor im Konstruktor aufgerufen.
Kapazität erweitern
void expandCapacity(int minimumCapacity)
Diese Methode hat Paketzugriffsberechtigungen, und mehrere Methoden in der Klasse werden diese Methode aufrufen, um die Kapazität zu erweitern, wenn die Kapazität nicht ausreicht.
Quellcode:
void ExpinationCapacity (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); }Fügen Sie die Pufferlänge um 1 zu 2 zur variablen Newcapacity hinzu und vergleichen Sie diesen Wert mit dem angegebenen Wert und bestimmen Sie den größeren Wert als neue Kapazität des Puffer. Rufen Sie dann die Kopiermethode der Arrays -Klasse an, die ein neues Array erstellt, und kopieren Sie dann alle Zeichen im Original -Array in das neue Array.
Sicherungspunkt (int minimumCapacity)
Öffentliche Leerlaufsicherheit (int minimumCapacity)
Stellen Sie sicher, dass die Kapazität mindestens dem angegebenen Mindestwert entspricht. Wenn die aktuelle Kapazität geringer ist als der angegebene Wert, wird ein neues Array erstellt und die Kapazität des Neuarrays doppelt so hoch wie der angegebene Wert plus 2; Wenn die aktuelle Kapazität nicht geringer ist als der angegebene Wert, erfolgt keine Verarbeitung direkt.
Quellcode:
public void SeealCapacity (int minimumCapacity) {if (minimumCapacity> value.length) {ExpandCapacity (minimumCapacity); }}prüfen:
StringBuffer s = new StringBuffer (); System.out.println ("Kapazität:" + s.capacity ()); // Kapazität: 16 S.SenSurecapacity (10); System.out.println ("Kapazität:" + s.capacity ()); // Kapazität: 16 S.Sensecapacity (30); System.out.println ("Kapazität:" + s.capacity ()); // Kapazität: 34 S.Sensecapacity (80); System.out.println ("Kapazität:" + s.capacity ()); // Kapazität: 80Verfahren
Die CodePointat -Methode wird unter Verwendung von Charakter.CodePointatImpl (Wert, Index, Anzahl) implementiert.
public int codePointat (int index) {if ((index <0) || (index> = count)) {throck stringIndexoutOfBoundSexception (Index); } return Zeichen }Die Getchars -Methode wird mit der Methode des Systems.ArrayCopy () implementiert
public void getChars (int srcBegin, int srcend, char [] dst, int dstbegin) {if (srcBegin <0) werfen neue StringIndexoutOfBoundSexception (srcBegin); if ((srcend <0) || (srcend> count)) neue stringIndexoutofBoundSexception (srcend) werfen; if (srcBegin> srcend) werfen neue StringIndexoutOfBoundSexception ("srcBegin> srcend"); System.ArrayCopy (Wert, SrcBegin, DST, DSTBEGIN, SRCEND - SRCBEGIN); }Die Anhangsmethode beinhaltet die methode sealecapacityInternal () und die Getchars () -Methode, um sie zu implementieren
public AbstractStringBuilder append (string str) {if (str == null) return appendnull (); int len = str.length (); sealEcapacityInternal (count + len); Str.Getchars (0, Len, Wert, Graf); zählen += len; gib dies zurück; }Arrays.copyof () wird zur Implementierung verwendet
void ExpandCapacity (int minimumCapacity) {int newCapacity = value.length * 2 + 2; if (newCapacity - minimumCapacity <0) newCapacity = minimumCapacity; if (newCapacity <0) {if (minimumCapacity <0) // Überlauf -Neue outofMemoryError (); newCapacity = Integer.max_Value; } value = arrays.copyof (value, newCapacity); }Arrays.fill (Wert, Graf, NewLength, '/0'); Kopie zwischen Strings
public void setLength (int newLength) {if (newLength <0). sealEcapacityInternal (NewLength); if (count <newLength) {arrays.fill (Wert, Graf, NewLength, '/0'); } count = newLength; }Delete () ändert nur die Größe der Zeichenfolge und löscht die Zeichenfolge nicht wirklich
public AbstractStringBuilder delete (int start, int End) {if (start <0) neue StringIndexoutOfBoundSexception (start); if (Ende> count) end = count; if (Start> Ende) neue StringIndexoutOfBoundSexception () werfen; int len = Ende - Start; if (len> 0) {System.ArrayCopy (Wert, Start+len, Wert, Start, Graf-End); count -= len; } zurückgeben; }Lernen Sie, das System flexibel zu verwenden.ArrayCopy () Methode
public abstractStringBuilder Insert (int index, char [] str, int offset, int len) {if ((index <0) || (index> länge ()) werfen neue StringIndexoutofBoundSexception (Index); if ((Offset <0) || (len <0) || (Offset> Str.Length - len)) neue StringIndexoutOfBoundSexception ("Offset" + Offset + ", Len" + len + ", str.Length" + Str.Length); sealEcapacityInternal (count + len); System.ArrayCopy (Wert, Index, Wert, Index + len, count - Index); System.ArrayCopy (STR, Offset, Wert, Index, Len); zählen += len; gib dies zurück; }Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels über die detaillierte Interpretation des Quellcode des Quellcodes der AbstractStringBuilder -Klasse. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!