StringBuilder et StringBuffer sont deux classes couramment utilisées pour manipuler les chaînes. Comme nous le savons tous, StringBuilder est insérété, tandis que StringBuffer est thread-safe. Le premier a été ajouté par JDK1.5, et le second était disponible dans JDK1.0. Analyons leurs implémentations internes ci-dessous.
1. Relation de l'héritage
Classe finale publique StringBuffeRextend AbstractStringBuilDeImplements java.io.Serializable, CharSequencePublic final classe StringBuildExtens
On peut voir que la relation d'héritage entre les deux classes est exactement la même. Sérialisable est un drapeau sérialisable. L'interface CharSequence comprend des méthodes Charat (), Longueur (), Susencence () et ToString (). La classe String implémente également cette interface. L'accent est mis ici sur la classe abstraite AbstractStringBuilder, qui résume l'implémentation de la plupart des opérations de StringBuilder et StringBuffer.
2. AbstractStringBuilder
1. Variables et méthodes de construction
char [] value; int count; abstractStringBuilder () {} abstractStringBuilder (int la capacité) {value = new char [capabilité];}AbstractStringBuilder utilise un tableau de charbon pour enregistrer les chaînes, et la méthode de capacité initiale peut être spécifiée pendant la construction.
2. Élargir la capacité
public void assurecapacité (int minimumpapacité) {if (minimumcapacity> 0) assurecapacityInternal (minimumcapacity);} private void assurecapacityInternal (int minimumcapacity) {// trop-flux conscient du code if (minimum majuscule - Valeur. 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; } valeur = arrays.copyof (valeur, nouvellecapacité);}La méthode d'expansion est finalement mise en œuvre par expandcapacité (). Dans cette méthode, la capacité est d'abord étendue à la capacité d'origine plus 2. S'il est encore inférieur à la capacité spécifiée à ce moment, la nouvelle capacité est définie sur une capacité minimale. Déterminez ensuite s'il déborde. S'il déborde, définissez la capacité à Integer.max_value. Enfin, la copie de la valeur de valeur est évidemment une opération longue.
3. Méthode APPEND ()
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; }APPEND () est la méthode la plus couramment utilisée, elle a de nombreuses formes de surcharge. Ce qui précède est l'un d'eux, qui est utilisé pour ajouter les chaînes. Si STR est null, la méthode APPENDNULL () sera appelée. Cette méthode ajoute en fait des caractères tels que «n», «u», «l» et «l». S'il n'est pas nul, élargissez d'abord la capacité, puis appelez la méthode getchars () de String pour ajouter STR à la fin de la valeur. Enfin, l'objet lui-même est renvoyé, donc annex () peut être appelé en continu.
3. StringBuilder
AbstractStringBuilder a implémenté la plupart des méthodes requises, et StringBuilder et StringBuffer doivent être appelés. Jetons un coup d'œil à l'implémentation de StringBuilder.
1. Constructeur
public StringBuilder () {Super (16);} public StringBuilder (int Capacité) {super (capacité);} public StringBuilder (String str) {super (str.length () + 16); append (str);} public stringBuilder (chardequence seq) {this (seq.length () + 16); Ajouter (SEQ);}Comme on peut le voir, la taille de capacité par défaut de StringBuilder est 16. Bien sûr, vous pouvez également spécifier la capacité initiale ou attribuer la valeur initiale à l'objet StringBuilder dans une séquence de caractères existante.
2. Méthode APPEND ()
public StringBuilder append (string str) {super.append (str); Renvoie ceci;} public StringBuilder APPEND (CharSequence s) {super.append (s); retourne ceci;}Il existe de nombreuses méthodes de surcharge pour annex (), et en voici deux. De toute évidence, voici la méthode de la classe parent AbstractStringBuilder qui est appelée directement.
3. TOSTRING ()
public String toString () {// Créez une copie, ne partagez pas le tableau retour new String (valeur, 0, count);}La méthode toString () renvoie un nouvel objet de chaîne qui ne partage pas de mémoire avec l'objet d'origine. En fait, il en va de même pour la méthode substring () dans AbstractStringBuilder.
4. Sringbuffer
StiringBuffer est similaire à StringBuilder, mais pour obtenir une synchronisation, de nombreuses méthodes utilisent une modification lsynchronisée, comme la méthode suivante:
public synchronisé int longueur () {return count;} public synchronisé stringbuffer append (string str) {toStringCache = null; Super.APPEND (STR); renvoie ceci;} public synchronisé void setLength (int newLength) {toStringCache = null; super.setLength (newLength);} Comme vous pouvez le voir, la synchronisation est en effet ajoutée devant la méthode.
De plus, il existe également une variable ToStringCache dans les méthodes APPEND () et setLength () ci-dessus. Cette variable est utilisée pour le dernier cache de la méthode toString (). Chaque fois que StringBuffer est modifié, cette variable sera affectée à NULL. Le tostring de StringBuffer est le suivant:
String synchronisé public toString () {if (toStringCache == null) {toStringCache = arrays.copyofrange (valeur, 0, count); } return new String (toStringCache, true);}Dans cette méthode, si TOSTRINGCACHE est nul, il est mis en cache en premier. L'objet de chaîne retourné final est un peu différent, et ce constructeur a un paramètre vrai. Trouvez le code source de la chaîne et jetez un œil:
String (char [] valeur, partage booléen) {// Assert Share: "non partagée non prise en charge"; this.value = valeur;}Il s'avère que l'objet String construit par cette méthode de construction ne copie pas réellement la chaîne, mais pointe uniquement la valeur des paramètres de construction, qui consiste à gagner du temps à la copie des éléments. Cependant, ce constructeur a des autorisations d'accès aux packages et ne peut pas être appelé en général.
Résumer
Ce qui précède concerne cet article. J'espère qu'il sera utile pour tout le monde d'apprendre deux classes de chaîne de fonctionnement couramment utilisées dans Java, StringBuilder et StringBuffer.