[Java] Comparaison correcte du type String

Explorons la comparaison des types de chaînes

Organisation de la comparaison des valeurs de type String.

Méthode de comparaison égale

  1. == -Pour les types primitifs, comparez les valeurs. -Dans le type d'objet, les valeurs de référence des objets sont comparées pour déterminer si les objets sont identiques.

  2. equals() Il ne peut être utilisé que dans le type d'objet et le contenu des objets est comparé pour déterminer si les objets ont la même valeur.

En d'autres termes, le type Strng est un objet de type référence, vous pouvez donc utiliser equals.

Vérification (est-il vraiment impossible de comparer avec ==)

StringSample.java


    String str1 = "A";
    String str2 = "A";
    String str3 = new String("A");
    System.out.println(str1.hashCode());
    System.out.println(str2.hashCode());
    if(str1 == str2) {
        System.out.println("TRUE");
    }else {
        System.out.println("FALSE");
    }
    if(str1 == str3) {
        System.out.println("TRUE");
    }else {
        System.out.println("FALSE");
    }

résultat

100
100
TRUE

C'est devenu VRAI. Est-il correct de comparer le type String avec ==?

Enquête

Le type String crée une valeur dans la zone du tas lors de son initialisation, mais il semble qu'elle sera réutilisée si la même valeur est utilisée.

J'ai essayé d'illustrer

String比較.png

Pour économiser de la mémoire, utilisez la zone (adresse = 100) où la valeur «A» correspond sans nouveau.

Comportement lorsque la valeur de String est modifiée

String比較2.png

Lorsque vous réécrivez la valeur de la variable, la valeur source de référence (adresse = 100) n'est pas modifiée, mais la destination de référence est modifiée en créant la nouvelle zone de "B". (Changement de l'adresse de référence de 100 à 200)

Qu'est-ce que l'objet String équivaut à faire

String.class


    private final char value[];

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;                //Valeur de son propre objet
                char v2[] = anotherString.value;  //Valeur de l'objet comparé
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])           //Décomposer la chaîne en caractère et comparer les valeurs
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

L'objet String est décomposé en char [] et les valeurs sont comparées une par une.

Conclusion

Les objets chaîne peuvent avoir la même valeur de référence (adresse de référence) pour différentes variables locales s'ils ont la même valeur pour économiser de la mémoire, mais cela n'est pas garanti et doit être comparé à des égaux.

Recommended Posts

[Java] Comparaison correcte du type String
[Java] Comparaison de vitesse de combinaison de chaînes
Concernant la comparaison d'équivalence de type de chaîne en Java
[Java] Comparaison des chaînes de caractères et && et ||
L'histoire de la comparaison de chaînes de bas niveau en Java
[Java] Comparaison de la vitesse de conversion de type
[Sécurité Null] Mémo de comparaison Kotlin Java Utilisation correcte de la sécurité Null
Diverses méthodes de la classe Java String
Chaîne Java
Initialisation avec une chaîne vide vers une instance de type Java String
[Java] Conversion de type implicite (somme AOJ10 de nombres)
Conversion de type de données de date Java (date, calendrier, chaîne)
[Java] Aide-mémoire de classe de type de données / chaîne de caractères
[Java] Convertit null du type Object en type String
[Java / Swift] Comparaison de l'interface Java et du protocole Swift
[Connaissance de base de Java] À propos de la conversion de type
Résumé Java des conversions de types fréquemment recherchées
Conversion de type Java 8 LocalDateTime (String, java.util.Date)
Conversion de type du type java Big Decimal au type String
[Java] Remplissage de la chaîne de caractères
Comparaison des chaînes MyBatis
[Java] Type d'énumération
Java Type facultatif
Java double type
[Java] Comparaison de cartes
Traitement des chaînes Java
Comparaison du framework Java
Chaîne divisée (Java)
[Java] Présentation de Java
[Java] Obtenir la longueur de la chaîne de paire de substitution
[Java] La partie déroutante de String et StringBuilder
[Java] Faites attention au type de clé de la carte
Conversion de type Java (chaîne, entier, date, calendrier, etc.)
Pourquoi la comparaison de classe de type chaîne Java (==) ne peut pas être utilisée
Revue Java ③ (utilisation de base des tableaux / type de référence)
Collection expirée de java
Caractéristiques prévues de Java
[Java] Signification de public static void main (String [] args)
NIO.2 examen de Java
Comparaison de la notation de la version Java
[Java] Comparaison de la vitesse d'exécution de la jointure de chaîne (+ opérateur vs StringBuilder)
[Java] Type de données ①-Type de base
Remplacement multiple de chaîne Java
[java.io] Résumé de l'entrée de chaîne Java (InputStream, Reader, Scanner)
[Java, Kotlin] Variance de type
Champ de type de classe Java
Histoire des annotations Java
[Note] Java: recherche de chaînes de caractères
Détermination de type en Java
Étudier Java # 1 (type typique)
[Note] Java: enquête sur les chaînes de caractères
java (mérites du polymorphisme)
[Java] À propos de Objects.equals () et examen de la comparaison de chaînes (== et égal à)
À propos de la classe Java String
J'étais accro à getXxxx de ResultSet car c'est un type primitif (Java)
[Java] Interdit d'utiliser un seul type d'alphabet FizzBuzz [Binding]
Examen NIO de Java
Comparaison équivalente de la classe wrapper Java et du type primitif