[Java] À propos de Objects.equals () et examen de la comparaison de chaînes (== et égal à)

Ingénieur Java Akuma-chan @akumachanit Démo! Aujourd'hui, c'est une démo qui parle de comparaison de chaînes!

Java 1.7 est là

** Quand parlez-vous ** démo? Akuma-chan était ** en train de développer une application avec JDK 1.6 au travail ** (une démo à laquelle on peut croire à l'époque de Reiwa? Mais c'est une démo à mettre à niveau!), Mais récemment, elle a été mise à jour. Une démo qui vous permet d'utiliser les fonctionnalités de 1.7!

Objects Démo avec Objects dans la classe ajoutée à partir de 1.7. Il semble que 1.7 soit sorti en 2011, donc je pense qu'il y a beaucoup de gens qui lisent ceci et ne sont pas devenus ingénieurs à ce moment-là. Je suis désolé d'en parler maintenant. (Une démo tellement égoïste qui n'était pas ingénieur à l'époque).

Donc, en utilisant la méthode ʻObjects.equals () de ces ʻObjects, j'ai vérifié les spécifications pour le moment, donc la démo que je vais écrire ici.

Une démo écrite dans la spécification «Objets» comme suit.

Cette classe (...) contient des méthodes nulles ou tolérantes à zéro pour comparer deux objets.

En d'autres termes, qu'est-ce que cela signifie?

if(a.equals("test")) { //NullPointerException si a est nul
}

Si vous écrivez un code comme celui-ci, si ʻavautnull, NullPointerExceptioin se produira. Il n'y a pas de méthode ʻequals (ou quoi que ce soit) dans null, donc c'est une démo naturelle. Dans un tel cas, il était nécessaire de placer la chaîne de caractères en premier ou d'effectuer d'abord la vérification «null».

if("test".equals(a)) { //Absolument NullPointerException ne se produit jamais
}
if(a != null && a.equals("test")) { //Si nul, ignorez le jugement
}

L'exemple ci-dessus ne peut pas être utilisé comme des variables où les deux peuvent être null, et ce n'est pas super beau d'écrire la même chose à chaque fois comme l'exemple ci-dessous! Objects.equals() ʻObjects.equals () `!! qui est apparu ici

Objects.equals(a, "test"); //Comme ça

public static boolean equals(Object a, Object b) Renvoie true si les arguments sont égaux les uns aux autres, false dans le cas contraire. Par conséquent, true est renvoyé si les deux arguments sont nuls et false si un seul argument est nul. Sinon, la méthode equals du premier argument est utilisée pour déterminer s'ils sont égaux.

ʻObjects.equals () est une démo qui renvoie truemême si les deux sont nuls! Ceci est une démo qui ne peut pas être faite avec la méthode conventionnelle mentionnée ci-dessus! Eh bien, un ʻObjects.equals ()si pratique, mais que se passe-t-il lorsque vous essayez de comparer des chaînes?

Examen de la comparaison de chaînes

Je pense que tous ceux qui utilisent Java savent que ** les chaînes ne doivent pas être utilisées à des fins de comparaison **! Une démo dont les gens qui ne savaient pas se souviendront certainement et reviendront ici. C'est une démo que vous aurez du mal à utiliser sans le savoir.

À propos de l'opérateur d'égalité (==)

Tout d'abord, une démonstration qui examine les spécifications Java pour les opérateurs d'égalité.

15.21. Equality Operators The equality operators may be used to compare two operands that are convertible (§5.1.8) to numeric type, or two operands of type boolean or Boolean, or two operands that are each of either reference type or the null type. All other cases result in a compile-time error.

(Traduction appropriée) Les opérateurs d'équivalence peuvent être utilisés entre «deux opérandes convertibles en type numérique», «entre deux opérandes booléens ou booléens» et «entre des opérandes de type référence ou de type nul». D'autres modèles entraîneront une erreur de compilation.

Puisque String est un type de référence, une démonstration à lire sur la comparaison entre le type de référence et le type null.

15.21.3. Reference Equality Operators == and != At run time, the result of == is true if the operand values are both null or both refer to the same object or array; otherwise, the result is false.

(Traduction appropriée) Au moment de l'exécution, le résultat de == est vrai si les valeurs des deux opérandes sont "toutes deux nulles" ou "toutes deux désignent le même objet ou tableau", sinon faux. ..

En d'autres termes, «==» est une démonstration qui vérifie si les objets référencés sont les mêmes.

Si vous utilisez == dans String

Ensuite, une démo pour voir le code qui compare réellement le == de String.

String a = "test";
String b = "test";

System.out.println(a == b);               // true

cette? Pas de problème de démo, non? ?? ?? Alors que diriez-vous de cette démo?

String a = "test";
String b = new String("test");

System.out.println(a == b);               // false

cette? N'est-ce pas une démonstration que le résultat est «false» après avoir remplacé «new» par «String» par «b»? Alors que diriez-vous de cette démo?

String a = "test";
String b = "te".concat("st");

System.out.println(a == b);               // false

C'est aussi une démo qui est devenue "fausse"!

La raison en est qu'en Java ** chaîne littérale ** (une chaîne entre guillemets doubles comme `` test '') ** fait référence à la même instance de type String. ** démo. En d'autres termes, quel que soit le nombre de fois que vous attribuez «test», une référence à la même instance de type «String» sera incluse dans la démo.

Donc, le premier exemple est une démo où quelque chose comme ça se passe en interne.

String x = new String("test");
String a = x;
String b = x;

System.out.println(a == b);               // true

Ceci est une démo facile à comprendre! Puisque ʻa et bfont référence àx, c'est une démonstration convaincante que ʻa == b est vrai.

Alors pourquoi n'était-il pas égal dans les deuxième et troisième exemples? Si vous utilisez new String () pour générer une chaîne, cela créera une nouvelle instance même si les valeurs sont les mêmes ** Démo .. Une démo de concat () aussi en interne en utilisant new String () pour renvoyer une nouvelle chaîne. (Cependant, notez que concat () retourne l'instance d'origine telle qu'elle est si la longueur de la chaîne d'argument est 0.)

Maintenant, c'est une démo où vous ne pouvez pas utiliser == pour comparer des chaînes. La raison est que même si les valeurs de ** String ** à comparer sont les mêmes, il n'y a aucune garantie qu'elles se réfèrent à la même instance ** Demo. Alors, comment pouvez-vous vérifier des chaînes avec différentes instances et la même valeur? !! C'est là qu'intervient la démo de la méthode String # equals ()! !! !!

String#equals() La méthode String # equals () est une démo qui vérifie la valeur de String!

String a = "test";
String b = new String("test");

System.out.println(a.equals(b));          // true

Bien! Ceci est une démo de solution! C'est une démo qui ne nécessite pas d'explication à ce stade. Pour la comparaison de String ** String # equals ()! !! Ceci est une démo parfaite! !! ** ** La démo qui semble être ... atteint enfin le problème au début ici.

// String#equals()Démos de code disgracieuses avec lesquelles vous devez écrire
if("test".equals(a)) { //Absolument NullPointerException ne se produit jamais
}
if(a != null && a.equals("test")) { //Si nul, ignorez le jugement
}

Hmmmm! La démo à laquelle je suis enfin arrivé! Voici la démo de production!

Objects.equals () effectue une vérification nulle

La démo que j'ai mentionnée au début est que # Objects.equals () checks null, et quand vous comparez nulls, il renvoie true!

String a = null;
String b = null;
Objects.equals(a, b); // true -N'entraîne pas NullPointerException

String a = null;
String b = "test";
Objects.equals(a, b); // false -N'entraîne pas NullPointerException

Donc, une démo qui m'a fait me demander. ** Qu'arrive-t-il aux comparaisons de chaînes? ** **

La raison pour laquelle j'ai pensé à cela est que String # equals () est en fait une démo qui compare des valeurs, mais sa classe parent ʻObjecta ʻObject # equals ()est **. Démonstration comparant ** des instances référencées plutôt que des valeurs. Plus précisément, une démo qui utilise == en interne.

// Object#equals()
public boolean equals(Object obj) {
    return (this == obj);
}

String # equals () est une démo qui ** remplace ʻObject # equals () `et réécrit le processus **.

Donc, quand vous connaissez ʻObjects # equals () , il s'appelle ʻObject, donc il se comporte de la même manière que ʻObject # equals`? Je pensais que c'était une démo. La réponse est la démonstration décrite dans les spécifications de méthode écrites au début.

~ (Omis) Sinon, la méthode equals du premier argument est utilisée pour déterminer s'ils sont égaux.

Une démonstration dans laquelle la ** méthode du premier argument ʻequals ** est spécifiée si les deux arguments ne sont pas null`. En d'autres termes, si vous passez une valeur de type «String» au premier argument, il comparera les valeurs. Si le premier argument est différent de «String» et le second argument est «String», il est de toute façon faux, donc le contenu de l'argument de la méthode «equals» n'est pas pertinent pour la démonstration.

Résumé

** Démo utilisant Objects.equals ()! !! !! ** **

Les références

Trucs officiels d'oracle et ceci et démos.

Recommended Posts

[Java] À propos de Objects.equals () et examen de la comparaison de chaînes (== et égal à)
[Java] À propos de String et StringBuilder
[Java] La partie déroutante de String et StringBuilder
NIO.2 examen de Java
Avis sur Java Shilber
[Java] Comparaison des chaînes de caractères et && et ||
À propos de la classe Java String
Examen NIO de Java
La comparaison d'énumération est ==, et equals est bonne [Java]
[Java] Gestion des chaînes de caractères (classe String et classe StringBuilder)
À propos des instances Java
[Java] Différence entre == et égal
[Java Silver] À propos de la méthode equals
[Java] HashCode et remplacement égal
Avantages et inconvénients de Java
À propos du package Java et de l'importation
[Java] Définit la structure de la classe de collection (à propos de HashSet et TreeSet)
Recommandation de l'opération set par Java (et compréhension de equals et hashCode)
[Java] J'ai réfléchi aux mérites et aux utilisations de "interface"
[Java] Comparaison de vitesse de combinaison de chaînes
À propos des méthodes Java statiques et non statiques
À propos des impressions diverses de "Test des microservices Java" et du contrat axé sur le consommateur
Diverses méthodes de la classe Java String
À propos de Lambda, Stream, LocalDate de Java8
À propos des méthodes equals () et hashcode ()
[Java débutant] À propos de l'abstraction et de l'interface
[Java débutant] == opérateur et méthode equals
À propos de la relation entre l'opérateur d'égalité de chaîne Java (==) et l'initialisation. Débutants
À propos de removeAll et de retentionAll de ArrayList
Comprendre equals et hashCode en Java
J'ai essayé de résumer les méthodes de Java String et StringBuilder
A propos des types primitifs et des types de référence Java
Etudier Java 8 (String Joiner et Join)
[Java] Comparaison correcte du type String
Ceci et cela à propos de Base64 (Java)
À propos de la classification et du concept de Immutable / Mutable / Const / Variable de Java et Kotlin.
Revue des connaissances «étranges Java» et Java souvent oubliées dans Java Bronze
À propos du fonctionnement de next () et nextLine ()
[À propos de JDBC qui connecte Java et SQL]
[Java / Swift] Comparaison de l'interface Java et du protocole Swift
[Java débutant] À propos de l'initialisation d'un tableau multidimensionnel
[Connaissance de base de Java] À propos de la conversion de type
Résumé de Java Math.random et import (calendrier)
[Java] Contenu de l'interface de collection et de l'interface de liste
Discrimination d'énum dans Java 7 et supérieur
Chaîne Java
== et égal
Revue Java
L'histoire de la comparaison de chaînes de bas niveau en Java
Pensez à la combinaison de Servlet et Ajax
A propos de l'ordre de description des propriétés système Java
Consulter le mémo de la copie de fichier de Java 1.7 ou version ultérieure
[Java] Résumé personnel des classes et méthodes (basique)
À propos des types de données Java (en particulier des types primitifs) et des littéraux
[Java] Obtenir la longueur de la chaîne de paire de substitution