Parce que lorsque vous regardez le code source de StringBuffer et StringBuilder, il a été constaté que les deux héritaient de l'abstractStringBuilder, et de nombreuses méthodes sont directement des méthodes de la classe parent AbstractStringBuilder, j'ai donc décidé de regarder d'abord le code source de l'abstroyingbuilder, puis de regarder StringBuffer et StringBuilder.
Emplacement: dans le package java.lang
Déclaration: Abstract Clvis AbstractStringBuilderimplements appendable, Charsequence
La classe AbstractStringBuilder a une modification abstraite, qui montre qu'elle ne peut pas être instanciée.
La classe AbstractStringBuilder a deux sous-classes: StringBuilder et StringBuffer.
Champs
/ ** * La valeur est utilisée pour le stockage des caractères. * / valeur char []; / ** * Le nombre est le nombre de caractères utilisés. * / int count;
Constructeur
1. Constructeur sans paramètre
AbstractStringBuilder () {}2. Lors de la création d'un objet de la classe d'implémentation AbstractStringBuilder, spécifiez la taille du tampon en capacité.
AbstractStringBuilder (INT CAPACITY) {Value = new Char [Capacité]; }Lorsque la sous-classe StringBuilder ou StringBuffer est instanciée, ce constructeur est appelé dans le constructeur.
Accroître la capacité
void expandCapacity(int minimumCapacity)
Cette méthode a des autorisations d'accès aux packages, et plusieurs méthodes de la classe appellent cette méthode pour augmenter la capacité lorsque la capacité est insuffisante.
Code source:
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 (valeur, newCapacity); }Ajoutez la longueur du tampon de 1 par 2 à la nouvelle capacité variable, puis comparez cette valeur avec la valeur spécifiée et déterminez la plus grande valeur en tant que nouvelle capacité du tampon; Ensuite, appelez la méthode CopyOf de la classe Arrays, qui crée un nouveau tableau, puis copiez tous les caractères du tableau d'origine dans le nouveau tableau.
Assurécapacité (int minimum majuscule)
Assurécapacité du public (int minimum actude)
Assurez-vous que la capacité est au moins égale à la valeur minimale spécifiée. Si la capacité actuelle est inférieure à la valeur spécifiée, un nouveau tableau est créé et la capacité du nouveau tableau est le double de la valeur spécifiée plus 2; Si la capacité actuelle n'est pas inférieure à la valeur spécifiée, aucun traitement n'est effectué directement.
Code source:
public void Assurecapacity (int minimumcapacity) {if (minimumcapacity> value.length) {ExpandCapacity (minimumCapacity); }}test:
StringBuffer s = new StringBuffer (); System.out.println ("Capacité:" + S.Capacity ()); // Capacité: 16 S.SenuRecapacity (10); System.out.println ("Capacité:" + S.Capacity ()); // Capacité: 16 S.Enserecapacity (30); System.out.println ("Capacité:" + S.Capacity ()); // Capacité: 34 S.Enserecapacity (80); System.out.println ("Capacité:" + S.Capacity ()); // Capacité: 80méthode
La méthode codepointat est implémentée à l'aide de caractères.codepointAmpll (valeur, index, nombre)
public int codepointat (int index) {if ((index <0) || (index> = count)) {lance new StringIndexoutofBoundSexception (index); } return caractères.codepointAmpll (valeur, index, count); }La méthode getchars est implémentée à l'aide de la méthode System.ArrayCopy ()
public void getchars (int srcbegin, int srcend, char [] dst, int dstbegin) {if (srcbegin <0) lance new StringIndexoutofboundSexception (srcbegin); if ((srCend <0) || (srcend> count)) lancez new StringIndexoutofBoundSexception (srcend); if (srcbegin> srcend) lancez new StringIndexoutofBoundSexception ("srcbegin> srcend"); System.ArrayCopy (Valeur, SrcBegin, DST, DSTBEGIN, SRCEND - SRCBEGIN); }La méthode d'ajout implique la méthode AssurecapacityInternal () et la méthode getchars () pour l'implémenter
public abstractStringBuilder append (String str) {if (str == null) return appendNull (); int len = str.length (); AssurecapacityInternal (Count + Len); str.getchars (0, len, valeur, comte); Count + = len; retourner ceci; }Arrays.copyof () est utilisé pour implémenter
void ExpandCapacity (int minimumCapacity) {int newcapacity = value.length * 2 + 2; if (newCapacity - minimumcapacity <0) newCapacity = minimumCapacity; if (newCapacity <0) {if (minimumCapacity <0) // débordera de nouveaux ouvrages ultofMemoryError (); newCapacity = Integer.max_value; } value = arrays.copyof (valeur, newCapacity); }Arrays.filt (valeur, count, newLength, '/ 0'); Copier entre les chaînes
public void setLength (int newLength) {if (newLength <0) lancez new StringIndexoutofBoundSexception (newLength); asurecapacityInternal (newLength); if (count <newLength) {arrays.fill (valeur, count, newLength, '/ 0'); } count = newLength; }Delete () ne modifie que la taille de la chaîne et ne supprime pas vraiment la chaîne
public AbstractStringBuilder Delete (int start, int end) {if (start <0) lancez new StringIndexoutofBoundSexception (start); if (end> count) end = count; if (start> fin) lancez new StringIndexoutofBoundSexception (); int len = end - start; if (len> 0) {System.ArrayCopy (valeur, start + len, value, start, count-end); Count - = len; } retourne ceci; }Apprenez à utiliser de manière flexible la méthode System.ArrayCopy ()
Public AbstractStringBuilder Insert (int index, char [] str, int offset, int len) {if ((index <0) || (index> length ())) lancez new StringIndexoutofBoundSexception (index); if ((offset <0) || (len <0) || (offset> str.length - len)) lancez new StringIndexoutofBoundSexception ("offset" + offset + ", Len" + len + ", str.length" + str.length); AssurecapacityInternal (Count + Len); System.ArrayCopy (valeur, index, valeur, index + len, count - index); System.ArrayCopy (Str, Offset, Value, Index, Len); Count + = len; retourner ceci; }Résumer
Ce qui précède est tout le contenu de cet article sur l'interprétation détaillée du code source du code source de classe AbstractStringBuilder. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!