[Java] Beachten Sie, dass der Fall, in dem gleich ist, falsch ist, aber == ist.

Als ich die Äquivalenzbeziehung untersuchte, kam Java Equals heraus

Ich denke, Sie wissen gut, wann es wird. Dies ist die Zeit, in der es sich um unterschiedliche Instanzen handelt, die denselben Wert haben.

und umgekehrt

Ich denke nicht, dass der Fall des Werdens sehr vertraut ist.

Dieses Mal werden wir die Angelegenheit überprüfen.

Umgebung: Java1.8 Eclipse Neon.1

Problemquelle

python


	@org.junit.Test
	public void test() {
		boolean b1 = 1 == 1.0;
		
		Integer i2 = 1;
		boolean b2 = i2==1.0;        //true
		boolean b3 = i2.equals(1.0); //false

		System.out.println(b2);
		System.out.println(b3);
		
		
	}

Kommentar

Double # valueOf wird aufgerufen, um 1.0 vom Double-Typ zum Double-Typ automatisch zu boxen.

auto-boxing


    public static Double valueOf(double d) {
        return new Double(d);
    }

Es ist falsch, da es sich um einen Vergleich handelt, bei dem Gleichwerte zwischen 1,0, konvertiert in Double-Typ, und 1 vom Integer-Typ verwendet werden.

Integer.equals()


    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

Seien Sie vorsichtig mit Auto-Boxen.

Java Puzzle hat ein ähnliches Problem mit dem automatischen Boxen.

https://www.youtube.com/watch?v=V1vQf4qyMXg&t=11m19s

auto boxing can give you what we call the surprise left jab

by Joshua Bloch

Recommended Posts

[Java] Beachten Sie, dass der Fall, in dem gleich ist, falsch ist, aber == ist.
Wo ist die Zeitzone von Javas LocalDateTime.now ()?
Der Vergleich von enum ist == und gleich ist gut [Java]
5. Tag von Java
[Anmerkung] Java: Ist es notwendig, Gleichheit für die Beurteilung der Gleichheit zu überschreiben?
Meine Gedanken zur Equals-Methode (Java)
[Rails] Der Fall, in dem der Server nicht mehr funktioniert
Was ist das beste Lesen von Dateien (Java)
Was ist die Hauptmethode in Java?
Die Java EE Security API ist da!
[Java] Wo befindet sich die Implementierungsklasse der Annotation, die in BeanValidation vorhanden ist?
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?