[Java] Précautions lors de la comparaison de chaînes de caractères avec des chaînes de caractères

Conclusion: utilisez equals () lorsque vous comparez des chaînes stockées dans des variables en Java.

Que veux-tu faire

référence

Comparaison des chaînes et des chaînes https://www.javadrive.jp/start/string/index4.html

[Introduction à Java] Comment comparer des chaînes ("==" et "equals") https://www.sejuku.net/blog/14621

Lors de la substitution de valeurs numériques pour des variables et de la comparaison

int num = 10

if (num == 10) {
 System.out.println("num est 10.");
} else {
 System.out.println("num n'est pas 10.");
}

Dans cette formule, 10 est stocké dans la variable num, donc le résultat du traitement est

num est 10.

Lors de l'affectation d'un type de chaîne à une variable et de la comparaison

String str1 = "hoge"
String str2 = "hoge"

if (str1 == str2) {
 System.out.println("str1 et str2 sont identiques.");
} else {
 System.out.println("str1 et str2 sont différents.");
}

Dans cette formule, la variable str1 et la variable str2 stockent la même chaîne de caractères hoge, j'ai donc pensé que le résultat du traitement serait "str1 et str2 sont les mêmes".

str1 et str2 sont différents.

.. .. .. !? Hoge!? Pourquoi!? Je suis resté coincé dans un pot ici et je me suis retiré environ 300 fois.

Méthode "==" pour comparer si les emplacements où les chaînes sont stockées en mémoire sont les mêmes

Même si vous comparez avec "==", il sera traité comme une chaîne de caractères différente. C'est ce qu'on appelle une référence Java

Lorsqu'une chaîne de caractères est générée, un emplacement (zone) pour stocker la chaîne de caractères est sécurisé dans la mémoire. Hoge tient la «place» réservée

En d'autres termes, la valeur n'est pas stockée dans une variable, mais le mécanisme est tel que lorsque vous vous souvenez de l'emplacement et utilisez hoge, vous suivez cet emplacement et extrayez la valeur.

En raison de ce mécanisme de référence, lors de la comparaison avec "==", il ne s'agit pas de savoir si les valeurs des chaînes sont les mêmes, mais si les emplacements où les chaînes sont stockées dans la mémoire sont les mêmes.

Renvoie «true» si stocké dans la même zone de mémoire, sinon «false» Dans la formule précédente, str1 et str2 sont stockés dans différentes zones de mémoire, ils renvoient donc «false».

Comparez les chaînes en utilisant la méthode equals ()

String str1 = "hoge"
String str2 = "hoge"

if (str1.equals(str2)) {
 System.out.println("str1 et str2 sont identiques.");
} else {
 System.out.println("str1 et str2 sont différents.");
}

Résultat du traitement

str1 et str2 sont identiques.

Le résultat attendu est renvoyé.

Au fait, si vous écrivez en ruby, le même résultat sera renvoyé même avec "=="

str1 = "hoge"
str2 = "hoge"

if str1 == str2  then
 puts "str1 et str2 sont identiques."
else
 puts "str1 et str2 sont différents."
end

# =>str1 et str2 sont identiques.

Résumé

Lorsque vous utilisez ruby ou JavaScript, le "type numérique" et le "type de chaîne" peuvent être comparés en utilisant "==", j'ai donc écrit le programme en Java sans aucun doute, mais Java est différent.

J'ai vérifié les erreurs grammaticales de sorte qu'il y avait un trou dans l'écran, mais soyez prudent car si vous ne connaissez pas «référence», cela prendra plus de temps pour moi

fin

Recommended Posts

[Java] Précautions lors de la comparaison de chaînes de caractères avec des chaînes de caractères
Trier les chaînes comme une fonction caractéristique avec Java
[Rails] Précautions lors de la comparaison de la date et de l'heure avec DateTime
Erreur lors de la lecture avec java
Précautions lors du remplacement des guillemets par gsub
[Java] Supprimer les espaces dans les chaînes de caractères
Précautions lors de la création de PostgreSQL avec docker-compose
Remarques sur la communication HTTP avec Java (OkHttp)
Lors de l'appel de l'API avec java, javax.net.ssl.SSLHandshakeException se produit
Précautions lors de la migration de VB6.0 vers JAVA
[java] Résumé de la gestion des chaînes de caractères
Manipulation des chaînes Java
Spécifiez ClassPath lors de l'utilisation de jupyter + Java avec WSL
Calculer le score de similarité des chaînes de caractères avec JAVA
Code de caractère Java
[Java] Considérations lors de la gestion des nombres binaires négatifs avec Integer.parseInt ()
[Java] Conseils de tri lorsque les chaînes et les nombres sont mélangés
Remarquez un problème multi-thread lorsque vous travaillez avec Java Servlet
À propos de la conversion pleine largeur ⇔ demi-largeur des chaînes de caractères en Java
[Java] Gestion des chaînes de caractères (classe String et classe StringBuilder)
Installez java avec Homebrew
Changer de siège avec Java
Installez Java avec Ansible
Téléchargement confortable avec JAVA
Changer java avec direnv
Téléchargement Java avec Ansible
Raclons avec Java! !!
Construire Java avec Wercker
Conversion Endian avec JAVA
[Java] Méthode de comparaison de chaînes de caractères et méthode de comparaison utilisant des expressions régulières
Spécifiez le code de caractère de la source lors de la construction avec Maven
Méthode de configuration initiale lors de la création d'Alexa Skill avec JAVA (Cloud 9)
À propos du comportement lors de la création d'un mappage de fichiers avec Java
Précautions lors de l'utilisation de Mockito.anyString comme argument lors de Mocking avec Mockito
[Introduction à Java] Gestion des chaînes de caractères (classe String, classe StringBuilder)
[Java] UTF-8 (avec BOM) est converti en 0xFFFD (REMPLACEMENT CHARACTER)
Précautions lors de l'écriture d'un programme: 3e partie
Précautions lors du remplacement des guillemets par gsub
Précautions lors de la création de PostgreSQL avec docker-compose
[Java] Précautions lors de la comparaison de chaînes de caractères avec des chaînes de caractères