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

Partager une interprétation du code source de Java String

May 22, 2017 am 11:06 AM

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;
Copier après la connexion

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;
Copier après la connexion
Copier après la connexion

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";
Copier après la connexion

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];    }
Copier après la connexion

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;
    }
Copier après la connexion

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);
    }
Copier après la connexion

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);
    }
Copier après la connexion

À 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;
    }
Copier après la connexion

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;
    }
Copier après la connexion

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;
    }
Copier après la connexion

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);
    }
Copier après la connexion

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;
Copier après la connexion
Copier après la connexion
2. Utilisez la méthode concat (String)

      String a = new String("bb");
      String b = new String("aa"); 
      String d = a.concat(b);
Copier après la connexion
3. Utilisez StringBuilder

 String a = new String("bb");
 String b = new String("aa");
     
StringBuffer buffer = new StringBuffer().append(a).append(b);
Copier après la connexion
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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

Spring Boot simplifie la création d'applications Java robustes, évolutives et prêtes à la production, révolutionnant le développement de Java. Son approche "Convention sur la configuration", inhérente à l'écosystème de ressort, minimise la configuration manuelle, allo

See all articles