Maison  >  Article  >  Java  >  Partager une interprétation du code source de Java String

Partager une interprétation du code source de Java String

零下一度
零下一度original
2017-05-22 11:06:531392parcourir

Vous faire comprendre un article sur l'interprétation partielle du code source Java String, jetons-y un coup d'œil avec l'éditeur

variables membres de type String

/** String的属性值 */  
    private final char value[];    /** The offset is the first index of the storage that is used. */
    /**数组被使用的开始位置**/
    private final int offset;    /** The count is the number of characters in the String. */
    /**String中元素的个数**/
    private final int count;    /** Cache the hash code for the string */
   /**String类型的hash值**/
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;

Avec les variables membres ci-dessus, vous pouvez savoir que la valeur de la classe String est définitive et ne peut pas être modifiée, donc tant qu'une valeur change, un nouvel objet de type String sera généré et stocké Les données de chaîne ne commencent pas nécessairement par le premier point du tableau 0, mais par l'élément pointé par offset.

Le code suivant génère un nouvel objet, et le résultat final est une nouvelle valeur String avec une nouvelle valeur de "bbaa".

     String a = new String("bb");
     String b = new String("aa");
     String c =  a + b;

On peut également dire que la longueur des objets de type String est immuable. Les chaînes d'épissage de chaînes généreront un nouvel objet à chaque fois, donc l'efficacité de l'épissage des chaînes n'est certainement pas aussi élevée que celle de la variable. length StringBuffer et StringBuilder sont rapides.

Cependant, dans la situation suivante, deux chaînes sont rapidement épissées :

    String a = "aa" + "bb";

La raison est la suivante : Java a fait une petite optimisation pour l'épissage des chaînes directement "aa" et "bb". " dans "aabb", puis attribuez la valeur à a. Vous n'avez besoin de générer l'objet String qu'une seule fois, ce qui permet d'économiser deux fois la génération de String par rapport à la méthode ci-dessus et est évidemment beaucoup plus efficace.

Jetons un coup d'œil à certaines des méthodes de construction communes de String

Méthode de construction sans paramètre :

public String() {    this.offset = 0;    this.count = 0;    this.value = new char[0];    }

2. Passer le constructeur d'un objet de type String

public String(String original) {    int size = original.count;    char[] originalValue = original.value;    char[] v;      if (originalValue.length > size) {         // The array representing the String is bigger than the new         // String itself.  Perhaps this constructor is being called         // in order to trim the baggage, so make a copy of the array.
            int off = original.offset;
            v = Arrays.copyOfRange(originalValue, off, off+size);
     } else {         // The array representing the String is the same         // size as the String, so no point in making a copy.
        v = originalValue;
     }    this.offset = 0;    this.count = size;    this.value = v;
    }

3. Passer le constructeur d'un tableau de caractères

public String(char value[]) {    int size = value.length;    this.offset = 0;    this.count = size;    this.value = Arrays.copyOf(value, size);
    }

4. Passer un numéro de chaîne de caractères, élément de départ. , et le nombre de constructeurs d'éléments

public String(char value[], int offset, int count) {        if (offset < 0) {            throw new StringIndexOutOfBoundsException(offset);
        }        if (count < 0) {            throw new StringIndexOutOfBoundsException(count);
        }        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {            throw new StringIndexOutOfBoundsException(offset + count);
        }        this.offset = 0;        this.count = count;        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }

À partir des constructeurs communs ci-dessus, nous pouvons voir que lorsque nous générons un objet String, nous devons définir le décalage, les trois attributs count et value sont attribués, de sorte que nous peut obtenir un type String terminé.

Fonctions communes :

1. Fonction pour déterminer si deux chaînes sont égales (Equal) : En fait, il s'agit d'abord de déterminer si l'instance de comparaison est de type String. data, not Puis renvoie False, s'ils comparent chaque élément de caractère pour voir s'ils sont identiques, s'ils sont identiques, renvoie True, sinon renvoie False

public boolean equals(Object anObject) { if (this == anObject) {     return true;
 } if (anObject instanceof String) {
     String anotherString = (String)anObject;     int n = count;     if (n == anotherString.count) {  char v1[] = value;  char v2[] = anotherString.value;  int i = offset;  int j = anotherString.offset;  while (n-- != 0) {      if (v1[i++] != v2[j++])   return false;
  }  return true;
     }
 } return false;
    }

2. Fonction pour comparer les tailles de deux chaînes (compareTo) : L'entrée est composée de deux chaînes. Le 0 renvoyé signifie que les deux chaînes ont la même valeur. Renvoyer moins de 0 signifie que la valeur de la première chaîne est inférieure à la valeur de la. deuxième chaîne. S'il est supérieur à 0, cela signifie que la première chaîne est supérieure à la valeur de la deuxième chaîne.

Le processus de comparaison est principalement le suivant : à partir du premier élément des deux chaînes, la comparaison réelle est le code ACII des deux caractères. Si des valeurs différentes sont ajoutées, la première valeur différente sera. renvoyé. Différence, sinon renvoie 0

public int compareTo(String anotherString) { int len1 = count; int len2 = anotherString.count; int n = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; if (i == j) {     int k = i;     int lim = n + i;     while (k < lim) {  char c1 = v1[k];  char c2 = v2[k];  if (c1 != c2) {      return c1 - c2;
  }
  k++;
     }
 } else {     while (n-- != 0) {  char c1 = v1[i++];  char c2 = v2[j++];  if (c1 != c2) {      return c1 - c2;
  }
     }
 } return len1 - len2;
    }

Afficher le code

3. Déterminez si une chaîne commence par une chaîne de préfixe et si le décalage a la même longueur

public boolean startsWith(String prefix, int toffset) { char ta[] = value; int to = offset + toffset; char pa[] = prefix.value; int po = prefix.offset; int pc = prefix.count; // Note: toffset might be near -1>>>1.
 if ((toffset < 0) || (toffset > count - pc)) {     return false;
 } while (--pc >= 0) {     if (ta[to++] != pa[po++]) {         return false;
     }
 } return true;
    } public int hashCode() { int h = hash; if (h == 0) {     int off = offset;     char val[] = value;     int len = count;            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }        return h;
    }

4. Connectez deux chaînes (concat)

public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) {     return this;
 } char buf[] = new char[count + otherLen];
 getChars(0, count, buf, 0);
 str.getChars(0, otherLen, buf, count); return new String(0, count + otherLen, buf);
    }

Plusieurs façons de connecter des chaînes

1 La plus directe, utilisez + pour connecter directement

<.>
     String a = new String("bb");
     String b = new String("aa");
     String c =  a + b;
2. Utilisez la méthode concat (String)

      String a = new String("bb");
      String b = new String("aa"); 
      String d = a.concat(b);
3. Utilisez StringBuilder

 String a = new String("bb");
 String b = new String("aa");
     
StringBuffer buffer = new StringBuffer().append(a).append(b);
Les première et deuxième méthodes sont utilisées plus souvent, mais l'efficacité est relativement médiocre. L'utilisation de StringBuilder pour l'épissage est plus efficace.

【Recommandations associées】


1.

String est-il un objet ou une classe en Java ? Explication détaillée de String en Java

2

Résumé des exemples de tutoriels de la classe String en Java

3. Classe de chaînes en Java ? Résumez les méthodes courantes de la classe String en Java

4

Partagez des exemples de didacticiels de la classe String en Java

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn