[JAVA] À peu près la même et la même valeur

Cette fois, nous parlons du concept de «même» en Java.

Deux significations différentes du mot même

Le premier est appelé «même» et le second est appelé «égal».

À peu près le même

Object hoge = new Object();
Object huga = hoge; //Copiez la référence hoge et attribuez-la à huga

À ce moment, on dit que hoge et huga sont les mêmes. L'identité est jugée par l'opérateur ==.

Par exemple

Object hoge = new Object();
Object huga = new Object();
huga = hoge;

Même ainsi, hoge et huga ne sont pas les mêmes (car ce sont des instances différentes).

À peu près la même valeur

public class Cat{
  private String name;
  public Cat(String name) {
    this.name = name;
  }
}

Créez deux instances avec la même valeur de nom à l'aide de la classe.

    Cat hoge = new Cat("neko");
    Cat huga = new Cat("neko");

Comme mentionné dans la section précédente, ces deux instances ne sont pas les mêmes car elles ont des références différentes. Cependant, chaque référence a la même valeur. Un tel état est dit que hoge et huga ont la même valeur.

** L'équivalence ne peut pas être jugée avec ==. ** hoge == huga renvoie false.

Jugement d'équivalence

Utilisez la méthode d'égalité pour déterminer l'équivalence. ** Cependant, la méthode equals définie dans la classe Object est une implémentation qui vérifie l'identité. ** **

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

Par conséquent, si différentes instances ont la même valeur (valeur égale) est déterminée en remplaçant la méthode ** equal. ** **

public static class Cat {
    private String name;
    public Cat(String name) {
      this.name = name;
    }
    public boolean equals(Object obj) {
      if (obj == null){
        return false;
      }
      if (obj instanceof Cat){
        Cat cat = (Cat) obj;
        return cat.name == this.name;
      }
      return false;
    }
  }

Si tel est le cas, vous pouvez juger de l'équivalence en utilisant hoge.equals (huga). En passant, selon la manière d'écrire le remplacement de la méthode equal, il est possible de juger que dans une classe avec plusieurs valeurs, si l'une des valeurs correspond, elle est considérée comme la même valeur.

À peu près la même et la même valeur des littéraux de chaîne de caractères

Le type String est un type de données de type référence, mais une instance ne peut être créée qu'avec une chaîne littérale (entre ""). ** À l'exception des instances créées avec ce littéral de chaîne, l'opérateur == peut être utilisé pour déterminer l'équivalence. ** **

public static void main(String[] args) {
    String a= "neko";
    String b = "neko";
    System.out.println(a == b); //Renvoie avec vrai
  }

Cela est dû au fait que le littéral de chaîne est créé en tant que valeur constante dans l'espace mémoire pour les constantes différentes de l'instance, et qu'il existe un mécanisme appelé «pool de constantes» pour réutiliser les références.

Cependant, ce n'est que lorsque vous utilisez un littéral de chaîne, donc si vous créez une variable de type Ring avec l'opérateur new, vous ne pouvez pas juger de l'équivalence avec l'opérateur ==.

Les références

Capture approfondie de la collecte des problèmes Java SE11 Silver

Recommended Posts

À peu près la même et la même valeur
À propos des méthodes equals () et hashcode ()
À propos du fonctionnement de next () et nextLine ()
À propos de la méthode
À propos de la différence entre irb et pry
À propos du paquet
Pensez à la combinaison de Servlet et Ajax
[Rails / Active Record] À propos de la différence entre créer et créer!
À propos de next () et nextLine () de la classe Scanner
Un mémo sur le flux de Rails et Vue
Sortie sur la méthode, partie 2
À propos de la classe StringBuilder
Commentaire: à propos de l'interface
À propos du pipeline d'actifs
À propos de Bean et DI
À propos des classes et des instances
À propos de l'opérateur ternaire
À propos de gets et gets.chomp
À propos de la redirection et du transfert
À propos du module Kernel
À propos de l'encapsulation et de l'héritage
À propos de la méthode cartographique
À propos de Serializable et serialVersionUID
À propos de la méthode des ancêtres
[Sortie] À propos de la base de données
À propos de la méthode to_s.
[Ruby] J'ai réfléchi à la différence entre each_with_index et each.with_index
[Rails] J'ai étudié la différence entre les ressources et les ressources
Différences entre les classes et les instances dans Ruby
À propos de la relation entre les méthodes HTTP, les actions et CRUD
À propos du chargement et de l'initialisation des classes au démarrage de la JVM
[Note technique] À propos des avantages et des inconvénients de Ruby
À propos de la gestion de Null
A propos de la spécification du chemin JAXRS
À propos de l'instruction et de l'instruction if
À propos du verrouillage synchronisé et réentrant
Sortie sur la méthode Partie 1
Remarques sur la portée
À propos de la description de Docker-compose.yml
À propos des hachages et symboles Ruby
[Java] À propos de String et StringBuilder
À propos du cycle de vie Android
À propos des classes et des instances (évolution)
À propos de la méthode Pluck et de la méthode ID
À propos de l'explication sur le type de fonction
Prise en compte des classes et des instances
Pensez aux différences entre les fonctions et les méthodes (en Java)
À propos du package Java et de l'importation
À propos de Ruby, modèle objet
À propos du langage de programmation Crystal
Comment exécuter React et Rails sur le même serveur
Prise en compte de la méthode des temps
À propos des classes et des instances Ruby
À propos des variables d'instance et attr_ *
[Java] J'ai réfléchi aux mérites et aux utilisations de "interface"