Wenn ich Java bei der Arbeit verwende, verwende ich häufig Equals für die Äquivalenzbewertung. Als ich ein Neuling war, hörte ich, dass "Äquivalente gleich sind!" Dies ist jedoch eine Geschichte von Objekttypen wie dem String-Typ.
Hier machte ich mir Sorgen um int / Integer und long / Long, die primitive Typen haben. Es stellte sich die Frage: "Langer Typ ist ein Objekttyp, daher können Sie mit == normalerweise nicht vergleichen?"
Es ist eine einfache Frage, also habe ich versucht, sie zu überprüfen.
Das Ziel ist ein langer Typ mit einem primitiven Typ, und die Vergleichsmethode verwendet nur ==. Es fühlt sich an, als würde man auf verschiedene Weise eine Long-Typ-Instanz auf der linken Seite und einen Long-Typ auf der rechten Seite angeben. Auch ein Vergleich zwischen der Long-Konstante und dem Long-Typ. Es kann unbefriedigend sein, weil es nur das Muster ist, das ich mir schnell ausgedacht habe.
Die Überprüfung wurde durch Ausführen der folgenden Methode auf Junit4 bestätigt. Ich denke, es hängt nicht von der Version ab, aber ich habe Java 8 für alle Fälle verwendet. Einige wurden unter der Voraussetzung überprüft, dass "Langer Typ ein Objekttyp ist".
@Test
public void testEqualsMethod() {
Long value1 = 100L;
//Ein langer Typ, der mit einer der beiden Methoden erstellt wurde, wird als äquivalent bewertet
assertTrue(value1==100L); // (1)
assertTrue(value1==Long.parseLong("100")); // (2)
assertTrue(value1==Long.valueOf("100")); // (3)
assertTrue(value1==Long.valueOf(100)); // (4)
assertTrue(100L==Long.parseLong("100")); // (5)
assertTrue(100L==Long.valueOf(100)); // (6)
Long value2 = value1; //Wenn Long type ein Objekttyp ist
++value2; //Wenn Sie den Wert von Wert2 ändern, sollte sich auch der Wert von Wert1 ändern....
assertTrue(100L==value1); //Wert1 ändert sich jedoch nicht
assertTrue(101L==value2); //Wert2 wird fest um 1 erhöht
assertTrue(value1!=value2); //Natürlich sind die Objekte unterschiedlich...Scheint zu sein
}
Aus der obigen Testmethode wurde herausgefunden, dass die Äquivalenzbewertung unter Verwendung von == durchgeführt werden kann, wenn der Long-Typ durch eine beliebige Methode erzeugt wird. Das Gefühl von "Langer Typ-> Objekttyp-> gleich ist gleich" verschwindet jedoch nicht ... Es wurde auch festgestellt, dass selbst wenn der Long-Typ einem anderen Objekt zugewiesen ist, es kein Verhalten gibt, das der Objekttyp teilt. Mit anderen Worten, der Long-Typ wird als anderes Objekt erstellt, wenn er einer anderen Variablen zugewiesen wird.
Dieses Ergebnis kann für ähnliche Integer-Typen gesagt werden. Beim Double-Typ und Float-Typ war die Auswertung jedoch NG, wahrscheinlich weil valueOf () den Objekttyp in den Testmethoden (3) und (4) zurückgegeben hat. (Im Gegenteil, ich frage mich, warum Long-Typ und Integer-Typ durch valueOf () ... True wurden.)
Bei der Einstellung von "xxx == Xxx.parseXxx ()" oder "xxx == Xxx.valueOf ()" ist zu beachten, dass es sich um einen Ganzzahltyp oder einen Bruchtyp handelt. Die folgende Tabelle zeigt also, ob sie gleichwertig sind oder nicht.
Schimmel | Xxx.parseXxx() | Xxx.valueOf() |
---|---|---|
Long | Möglich | Möglich |
Integer | Möglich | Möglich |
Double | Möglich | 不Möglich |
Float | Möglich | 不Möglich |
Tatsächlich ist die Testmethode (5) ein Vergleich zwischen primitiven Typen, und (1), (2) und (6) sind äquivalente Vergleiche von [primitiven Typ] == [Objekttyp]. Daher ist es möglich, dass "Ist es nicht wahr?"
Wenn dies so bleibt, wird es mit dem Schlürfen gezogen, daher möchte ich diese Frage zu einem anderen Zeitpunkt untersuchen. Es ist einmal geöffnet. .. ..
Ich wollte auch die Art des Autoboxing bestätigen, also experimentierte ich mit der folgenden Testmethode. Es ist so, als würde man eine Methode mit einem Objekttypargument vorbereiten und verschiedene Werte in die Methode werfen, um zu sehen, um welche Art von Klasse es sich handelt. (Überprüfungsumgebung: Java8, JUnit4)
@Test
public void testAutoBoxing() {
//Eine Klasse, die nur den Klassennamen des Arguments zurückgibt
class AutoBoxingTester {
public String get(Object obj) {
return obj.getClass().getName();
}
};
AutoBoxingTester tester = new AutoBoxingTester();
//Ich habe versucht, verschiedene Werte einzugeben
assertEquals(Integer.class.getName(), tester.get(100));
assertEquals(Long.class.getName(), tester.get(100L));
assertEquals(String.class.getName(), tester.get("str"));
assertEquals(Float.class.getName(), tester.get(3.14f));
assertEquals(Double.class.getName(), tester.get(6.0e23));
}
Recommended Posts