[Java] Comparaison d'équivalence où les débutants échouent dans la comparaison de chaînes de caractères. Vous n'êtes peut-être même pas conscient de l'erreur! ??

Lorsque vous essayez de déterminer si deux chaînes de caractères sont équivalentes, vous souhaiterez intuitivement utiliser ==. Cependant, en Java, vous devez utiliser la méthode ʻequals au lieu de == `lors de la comparaison de chaînes. Afin de comprendre la raison de cela, je pense qu'il est nécessaire de comprendre que ** les chaînes sont des types d'objets (types de référence) en Java et les caractéristiques des chaînes. ** **

Variable de type d'objet (type de référence)

Pour les types d'objets, le «nouvel opérateur» est généralement utilisé pour allouer la zone de mémoire requise à partir de la classe qui est le dessin de conception de l'objet et créer une instance. Et en Java, le type d'objet est ** pointer **. En d'autres termes, la variable stocke la valeur d'adresse de la mémoire où la valeur réelle est stockée, pas la valeur. À propos, int et boolean sont appelés types primitifs, et cette variable contient la valeur elle-même.

Générer un objet String

String str = "hoge";

Normalement, dans le cas d'un type d'objet, l'objet est créé en utilisant le nouvel opérateur, mais dans le cas de String, il existe un mécanisme pratique qui peut être créé sans utiliser le nouvel opérateur, donc = Il peut être généré avec seulement "" . De plus, en générant avec =" ", vous pouvez bénéficier du mécanisme appelé String Constant Pool, qui sera décrit plus loin.

String Constant Pool (mécanisme de réutilisation des chaînes)

String Constant Pool est un mécanisme permettant d'économiser de la mémoire lors de la création d'un nouvel objet String. La valeur est conservée dans une zone de mémoire spéciale appelée pool de constantes String, et lorsqu'une nouvelle chaîne de caractères est générée, le pool est vérifié pour le même contenu de l'objet String, et s'il y en a, la référence est réutilisée. Te donnera. Pour utiliser ce mécanisme, créez un objet String avec =" " sans utiliser le nouvel opérateur. (Il existe également un moyen d'utiliser explicitement le nouvel opérateur, mais je vais l'omettre.)

Lors de l'utilisation de StringConstantPool


//Comme c'est la première fois, une zone mémoire est sécurisée et générée comme d'habitude.
String str = "hoge";
//Référence existante car la même valeur existe déjà dans le pool de constantes String(Valeur d'adresse)Se connecter avec
String str_2 = "hoge";

Lorsque vous n'utilisez pas StringConstantPool


//La zone mémoire est sécurisée et générée comme d'habitude
String str = new String("hoge");
//Puisque le pool de constantes de chaîne n'est pas utilisé, la zone de mémoire est sécurisée et générée comme d'habitude.
String str_2 = new String("hoge");

Au fait, c'est la raison pour laquelle String est immuable. Il semble qu'il n'est pas possible de le modifier car le changement de l'un d'eux affectera tous les autres lorsque plusieurs chaînes identiques ont la même référence.

On peut mal comprendre que c'est cool avec ==

==Cas qui devient cool avec


String str = "hoge";
String str_2 = "hoge";
//La condition de cette instruction if est vraie, mais pas parce que les valeurs sont les mêmes(Valeur d'adresse)Est le même.
if(str == str_2){
    System.out.println("Les valeurs sont les mêmes");
}else{
    System.out.println("La valeur est différente");
}

Étant donné que la condition de l'instruction if dans le code ci-dessus est vraie, il peut sembler que les valeurs peuvent être comparées, mais il s'agit d'une comparaison de la destination de référence (valeur d'adresse) et du pool de constantes de chaîne. Cela devient vrai car la destination de référence (valeur d'adresse) était la même en raison de la réutilisation. Par conséquent, il ne tient pas dans les cas suivants.

==Mauvais cas


String str = "hoge";
String str_2 = new String("hoge");
//Dans ce cas, la référence n'est pas réutilisée, str et str_Référence de 2(Valeur d'adresse)Est différent, donc la condition est fausse.
if(str == str_2){
    System.out.println("Les valeurs sont les mêmes");
}else{
    System.out.println("La valeur est différente");
}

Comment comparer correctement les valeurs

Pour comparer les valeurs elles-mêmes, utilisez la «méthode equals» comme mentionné au début.

String str = "hoge";
String str_2 = new String("hoge");
//Vous pouvez comparer les valeurs elles-mêmes en utilisant la méthode d'égalité.
if(str.equals(str_2)){
    System.out.println("Les valeurs sont les mêmes");
}else{
    System.out.println("La valeur est différente");
}

Résumé

J'ai introduit une méthode pour comparer correctement les chaînes dans le cas de Java. Je pense que le fait est que le type String est un type d'objet et que le type d'objet contient la destination de référence (valeur d'adresse) au lieu de la valeur. Si vous pouvez comprendre ces deux choses, vous pouvez comprendre la raison de l'utilisation de la méthode «equals». En passant, il semble que vous puissiez comparer des valeurs avec == dans des langages relativement nouveaux tels que Swift et Kotlin.

référence

Recommended Posts

[Java] Comparaison d'équivalence où les débutants échouent dans la comparaison de chaînes de caractères. Vous n'êtes peut-être même pas conscient de l'erreur! ??
L'histoire de la comparaison de chaînes de bas niveau en Java
Concernant la comparaison d'équivalence de type de chaîne en Java
Résumer le cycle de vie des objets Java à prendre en compte dans le développement Android
Ressentez le passage du temps même à Java
Éléments à prendre en compte lors de l'écriture de code en Java
[Rails] Où faire attention dans la description de la validation
L'histoire de ne pas connaître le comportement de String en passant par Java
[Java] Comparaison de vitesse de combinaison de chaînes
[Java] Comparaison correcte du type String
Trouvez le maximum et le minimum des cinq nombres saisis en Java
L'histoire selon laquelle le servlet n'a pas pu être chargé dans l'application Web Java
[Java] [Microsoft] Éléments à prendre en compte lors de l'inclusion du pilote JDBC SQL Server dans un fichier jar