Ich habe Java-Primitivtypen untersucht

Einführung

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.

Zu vergleichende Muster identifizieren

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.

Lassen Sie uns überprüfen! !!

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
}

Erwägung

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. .. ..

Bonus

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

Ich habe Java-Primitivtypen untersucht
Java primitive Typen, Referenztypen, unveränderlich, veränderlich
Informationen zu primitiven Java-Typen und Referenztypen
Informationen zu Java-Datentypen (insbesondere primitiven Typen) und Literalen
Ich habe zuerst Java touched berührt
Ich habe zuerst Java touched berührt
Ich habe zuerst Java touched berührt
Ich habe die Testautomatisierung untersucht
Zusammenfassung der primitiven Java-Spezialisierung
Ich habe zuerst Java berührt
[Java] Hauptdatentypen
[Java] Variablen- und Typtypen
Java-Grunddatentypen
Ich habe die Typen und Grundlagen von Java-Ausnahmen zusammengefasst
Äquivalenter Vergleich von Java-Wrapper-Klasse und primitivem Typ
Was ich über Java 8 recherchiert habe
Ich habe die beiliegende Instanz untersucht.
Ich habe Java Gold gestartet (Kapitel 1-1)
Was ich über Java 6 recherchiert habe
Was ich über Java 9 recherchiert habe
Informationen zu Java Class Loader-Typen
Ich habe Java SE8 Gold genommen.
Ich habe Drools (Java, InputStream) ausprobiert.
Was ich über Java 7 recherchiert habe
Ich habe versucht, Java REPL zu verwenden
[Java] Ich habe versucht, die Kombination zu implementieren.
Bei der Java-Parallelverarbeitung bin ich mir nicht sicher
Ich habe Randoop untersucht, einen JUnit-Testklassengenerator für Java.
Ich wollte glauben, ich hätte Elms benutzerdefinierte Typen in Java verstanden
Generieren Sie Stream aus einem Array primitiver Typen in Java
Java Learning 1 (Lernen Sie verschiedene Datentypen)
Ich habe den Konstruktor (Java) studiert.
Ich habe versucht, Metaprogrammierung mit Java
Was ich über Java 5 recherchiert habe
Ich habe eine E-Mail in Java gesendet
Deklaration, Initialisierung und Typen von Java-Variablen
[Java] Grundtypen und Anweisungshinweise
Java Primer Series (Variationen und Typen)
Ich habe ein PDF mit Java erstellt.
Ich habe eine shopify App @java erstellt
Grundlegende Datentypen und Referenztypen (Java)
Ich habe Java Flight Recorder (JFR) überprüft.
In Java Silver gefallen (weinend)
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, UDP mit Java zu kommunizieren
Java-Array-Variablen sind Referenztypen
Ich habe Gordobachs Theorem in Java geschrieben
Ich habe das Java-Framework "Quarkus" ausprobiert.
Ich habe versucht, die Java8 Stream API zu verwenden
Was ich mit Java Gold gelernt habe
Ich habe eine Anmerkung in Java gemacht.
Ich habe versucht, JWT in Java zu verwenden
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Java-Basisdatentypen und Referenztypen
Liste der in Java 9 hinzugefügten Typen
Was ich mit Java Silver gelernt habe
Was ich über Java-Lernen recherchiert habe
Ich habe jetzt versucht, Java 8 zusammenzufassen
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe Java und Rubys FizzBuzz verglichen.
[Java] Ausnahmetypen und grundlegende Verarbeitung