Datentypen in Java können in zwei Kategorien unterteilt werden:
1. Grundlegende Datentypen, auch primitive Datentypen genannt. Um Byte, Short, Char, Int, Long, Float, Double und Boolean zu vergleichen, verwenden Sie das doppelte Gleichheitszeichen (==) und vergleichen Sie ihre Werte.
2. Zusammengesetzte Datentypen (Klassen) Wenn sie mit (==) verglichen werden, werden sie mit ihren Speicheradressen im Speicher verglichen. Daher ist das Ergebnis ihres Vergleichs wahr Ergebnis ist falsch. Alle Klassen in JAVA erben von der Basisklasse Object. Das anfängliche Verhalten dieser Methode besteht darin, die Speicheradressen von Objekten zu vergleichen, z. B. String , Integer und Date, equal hat in diesen Klassen eine eigene Implementierung, anstatt die Speicheradresse der Klasse im Heap-Speicher zu vergleichen. Beim Gleichheitsvergleich zwischen zusammengesetzten Datentypen basiert der Vergleich zwischen ihnen ohne Überschreiben der Gleichheitsmethode immer noch auf dem Adresswert ihres Speicherorts im Speicher, da die Gleichheitsmethode von Object auch ein doppeltes Gleichheitszeichen (==) verwendet , daher ist das Ergebnis des Vergleichs dasselbe wie das Ergebnis des doppelten Gleichheitszeichens (==).
Kopieren Sie den Codecode wie folgt:
publicclass TestString {
publicstaticvoid main(String[] args) {
String s1="Montag";
String s2="Montag";
wenn (s1 == s2)
{
System.out.println("s1 == s2");}
anders{
System.out.println("s1 != s2");}
}
}
Kompilieren Sie das Programm und führen Sie es aus, Ausgabe: s1 == s2 Hinweis: s1 und s2 beziehen sich auf dasselbe String-Objekt – „Montag“ 2. Wenn Sie das Programm geringfügig ändern, werden Sie etwas noch Merkwürdigeres finden:
Kopieren Sie den Codecode wie folgt:
publicclass TestString {
publicstaticvoid main(String[] args)
{
String s1="Montag";
String s2 =new String("Monday");
if (s1 == s2) {System.out.println("s1 == s2");
}
anders
{
System.out.println("s1 != s2");
}
if (s1.equals(s2))
{
System.out.println("s1 gleich s2");
}
anders
{
System.out.println("s1 ist nicht gleich s2");
}
}
}
Wir verwenden den neuen Operator, um eine Programmausgabe für s2 zu erstellen: s1 != s2 s1 gleich s2 Hinweis: s1 und s2 beziehen sich jeweils auf zwei „Monday“-String-Objekte.
3. String-Pufferpool Es stellt sich heraus, dass das Programm beim Ausführen einen String-Pufferpool erstellt. Wenn Sie zum Erstellen einer Zeichenfolge einen Ausdruck wie s2 = „Montag“ verwenden, sucht das Programm zunächst nach demselben Wert in der Zeichenfolge Pufferpool. Im ersten Programm wurde s1 zuerst in den Pool gelegt. Als s2 erstellt wurde, fand das Programm s1 mit demselben Wert und verwies s2 auf das von s1 referenzierte Objekt. Mit dem neuen Operator teilt er dem Programm klar mit: „Ich möchte ein neues! Nicht das alte!“ So wird ein neues „Monday“-Sting-Objekt im Speicher erstellt. Ihre Werte sind die gleichen, aber ihre Standorte sind unterschiedlich: Einer schwimmt im Pool und der andere ruht am Ufer. Ups, was für eine Ressourcenverschwendung. Warum müssen wir sie trennen, wenn sie offensichtlich gleich sind?
4. Ändern Sie das Programm erneut:
Kopieren Sie den Codecode wie folgt:
publicclass TestString
{
publicstaticvoid main(String[] args)
{
String s1="Montag";
String s2 =new String("Monday");
s2 = s2.intern();
wenn (s1 == s2)
{
System.out.println("s1 == s2");
}
anders
{
System.out.println("s1 != s2");
}
if (s1.equals(s2))
{
System.out.println("s1 gleich s2");
}
anders
{
System.out.println("s1 ist nicht gleich s2");
}
}
}
Diesmal hinzugefügt: s2 = s2.intern(); Programmausgabe: s1 == s2 s1 gleich s2 Es stellt sich heraus, dass der Rückgabewert der intern()-Methode „abc“.intern() immer noch eine Zeichenfolge ist „abc“, oberflächlich betrachtet scheint diese Methode nutzlos zu sein. Tatsächlich macht sie jedoch einen kleinen Trick: Überprüfen Sie, ob sich im String-Pool eine Zeichenfolge wie „abc“ befindet, und geben Sie diese zurück, wenn sie vorhanden ist Zeichenfolge im Pool; falls nicht vorhanden, fügt diese Methode „abc“ zum Zeichenfolgenpool hinzu und gibt dann ihre Referenz zurück.