[JAVA] Ungefähr der gleiche und der gleiche Wert

Dieses Mal sprechen wir über das Konzept von "same" in Java.

Zwei verschiedene Bedeutungen des gleichen Wortes

Ersteres heißt "gleich" und letzteres heißt "gleich".

Ungefähr gleich

Object hoge = new Object();
Object huga = hoge; //Kopieren Sie die Hoge-Referenz und weisen Sie sie huga zu

Zu diesem Zeitpunkt sollen Hoge und Huga gleich sein. Die Identität wird vom Operator == beurteilt.

Zum Beispiel

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

Trotzdem sind Hoge und Huga nicht gleich (weil sie unterschiedliche Instanzen sind).

Ungefähr der gleiche Wert

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

Erstellen Sie mit der Klasse zwei Instanzen mit demselben Namenswert.

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

Wie im vorherigen Abschnitt erwähnt, sind diese beiden Instanzen nicht identisch, da sie unterschiedliche Referenzen haben. Jede Referenz hat jedoch den gleichen Wert. Ein solcher Zustand wird gesagt, dass Hoge und Huga den gleichen Wert haben.

** Äquivalenz kann nicht mit == beurteilt werden. ** hoge == huga gibt false zurück.

Beurteilung der Gleichwertigkeit

Verwenden Sie die Methode equals, um die Äquivalenz zu bestimmen. ** Die in der Object-Klasse definierte Methode equals ist jedoch eine Implementierung, die die Identität überprüft. ** ** **

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

Daher wird durch Überschreiben der Methode ** gleich bestimmt, ob verschiedene Instanzen denselben Wert (gleichen Wert) haben. ** ** **

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;
    }
  }

In diesem Fall können Sie die Äquivalenz mithilfe von hoge.equals (huga) beurteilen. Übrigens ist es abhängig davon, wie die Überschreibung der Equal-Methode geschrieben wird, zu beurteilen, dass in einer Klasse mit mehreren Werten, wenn einer der Werte übereinstimmt, dieser als der gleiche Wert betrachtet wird.

Ungefähr der gleiche und der gleiche Wert von Zeichenkettenliteralen

Der String-Typ ist ein Datentyp vom Referenztyp, eine Instanz kann jedoch nur mit einem String-Literal (eingeschlossen in "") erstellt werden. ** Mit Ausnahme von Instanzen, die mit diesem Zeichenfolgenliteral erstellt wurden, kann der Operator == verwendet werden, um die Äquivalenz zu bestimmen. ** ** **

public static void main(String[] args) {
    String a= "neko";
    String b = "neko";
    System.out.println(a == b); //Gibt mit true zurück
  }

Dies liegt daran, dass das Zeichenfolgenliteral als konstanter Wert im Speicherbereich für die von der Instanz abweichende Konstante erstellt wird und es einen Mechanismus namens "Konstantenpool" zum Wiederverwenden der Referenz gibt.

Dies ist jedoch nur bei Verwendung eines Zeichenfolgenliteral möglich. Wenn Sie also mit dem neuen Operator eine Variable vom Typ Ring erstellen, können Sie die Äquivalenz mit dem Operator == nicht beurteilen.

Verweise

Gründliche Erfassung der Java SE11 Silver-Problemsammlung

Recommended Posts

Ungefähr der gleiche und der gleiche Wert
Informationen zu den Methoden equals () und hashcode ()
Informationen zur Funktionsweise von next () und nextLine ()
Über die Methode
Über den Unterschied zwischen irb und pry
Über das Paket
Denken Sie an die Kombination von Servlet und Ajax
[Rails / Active Record] Über den Unterschied zwischen create und create!
Informationen zu next () und nextLine () der Scannerklasse
Ein Memo über den Fluss von Rails und Vue
Ausgabe über die Methode, Teil 2
Informationen zur StringBuilder-Klasse
Kommentar: Über die Schnittstelle
Über die Asset-Pipeline
Über Bean und DI
Über Klassen und Instanzen
Über den ternären Operator
Über bekommt und bekommt.chomp
Über Weiterleiten und Weiterleiten
Informationen zum Kernel-Modul
Über Kapselung und Vererbung
Über die Kartenmethode
Informationen zu Serializable und serialVersionUID
Über die Ahnenmethode
[Ausgabe] Informationen zur Datenbank
Informationen zur to_s-Methode.
[Ruby] Ich habe über den Unterschied zwischen each_with_index und each.with_index nachgedacht
[Rails] Ich habe den Unterschied zwischen Ressourcen und Ressourcen untersucht
Unterschiede zwischen Klassen und Instanzen in Ruby
Informationen zur Beziehung zwischen HTTP-Methoden, Aktionen und CRUD
Informationen zum Laden und Initialisieren von Klassen beim Start der JVM
[Technisches Memo] Über die Vor- und Nachteile von Ruby
Über den Umgang mit Null
Informationen zum Festlegen des JAXRS-Pfads
Über für Anweisung und wenn Anweisung
Über synchronisierte und Wiedereintrittssperre
Ausgabe über die Methode Teil 1
Hinweise zum Umfang
Informationen zur Beschreibung von Docker-compose.yml
Über Ruby-Hashes und -Symbole
[Java] Über String und StringBuilder
Über den Android-Lebenszyklus
Über Klassen und Instanzen (Evolution)
Über die Zupfmethode und die ID-Methode
Über die Erklärung zum Funktionstyp
Überlegungen zu Klassen und Instanzen
Denken Sie über die Unterschiede zwischen Funktionen und Methoden nach (in Java)
Über Java-Paket und Import
Über Ruby und Objektmodell
Über die Programmiersprache Crystal
So führen Sie React und Rails auf demselben Server aus
Überlegungen zur Zeitmethode
Informationen zu Ruby-Klassen und -Instanzen
Über Instanzvariablen und attr_ *
[Java] Ich habe über die Vorzüge und Verwendungen von "Schnittstelle" nachgedacht.