2010-01-07 6 views
15

So wurde ich heute diese Frage gestellt.Boxed Primitives und Equivalence

Integer a = 3; 
Integer b = 2; 
Integer c = 5; 
Integer d = a + b; 
System.out.println(c == d); 

Was wird dieses Programm ausgeben? Es gibt wahr zurück. Ich antwortete, dass es immer falsch ausdrucken wird, weil ich Auto (und Auto un) Boxen verstanden habe. Ich hatte den Eindruck, dass die Zuweisung von Integer a = 3 eine neue Ganzzahl (3) erzeugt, so dass ein == die Referenz und nicht den Grundwert auswertet.

Kann jemand das erklären?

+0

http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-event-though-its-much-newer-and-ha –

+0

Aber mögliche Duplikate von http : //stackoverflow.com/questions/1700081/why-does-128-128-return-false-but-127-127-return-true-when-converting-to-integ ist geeigneter, der vorherige war falsch. Aber vielleicht sind beide falsch ;-) –

Antwort

20

Boxed-Werte zwischen -128 und 127 werden zwischengespeichert. Boxen verwendet Integer.valueOf Methode, die den Cache verwendet. Werte außerhalb des Bereichs werden nicht zwischengespeichert und immer als neue Instanz erstellt. Da Ihre Werte in den zwischengespeicherten Bereich fallen, sind die Werte mit dem Operator == identisch.

Zitat von Java-Sprachspezifikation:

Wenn der Wert p wahr eingerahmt wird, falsch, ein Byte, ein Zeichen im Bereich \ u0000 u007f auf \ oder ein int oder kurz Zahl zwischen -128 und 127, dann lassen sich r1 und r2 die Ergebnisse von zwei beliebigen Box-Umwandlungen von p sein. Es ist immer der Fall, dass r1 == r2.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7

+0

+1: ihr wisst so viel :) Kannst du bitte einen Link zu einer Dokumentation geben, wo wir mehr über diese Caching-Sache erfahren können. – gameover

+1

Zeigen Sie die Quelle des JDK an. Gehe zu src.zip/java/lang/Integer.java und suche nach "cache = new Integer [256];". Das ist die Initialisierung. Als nächstes suchen Sie nach "public static Integer valueOf (int i)". Das ist eine Methode, die den Cache verwendet, um jedes Mal, wenn einer dieser Werte angefordert wird, den zwischengespeicherten Befehl zurückzugeben. – helios

+0

java.lang.Character hat auch ein Caché für Zeichen zwischen den Unicodes 0 und 127 (ascii-7/us-ascii). – helios

11

Das ist, was wirklich geschieht:

Integer c = Integer.valueOf(5); 
Integer d = Integer.valueOf(a.intValue() + b.intValue()); 

Java verwaltet einen Cache von Integer Objekte zwischen -128 und 127 vergleichen mit den folgenden:

Integer a = 300; 
Integer b = 200; 
Integer c = 500; 
Integer d = a + b; 
System.out.println(c == d); 

Welches sollte false drucken.

5

Es ist, weil einige der (auto-boxed) Ganzzahlen zwischengespeichert werden, so dass Sie tatsächlich die gleiche Referenz vergleichen - this post hat ausführlichere Beispiele und eine Erklärung.

4

Caching geschieht außerhalb auch von Autoboxing, bedenken Sie:

Integer a = 1; 
Integer b = new Integer(1); 
Integer c = Integer.valueOf(1); 

System.out.println(a == b); 
System.out.println(b == c); 
System.out.println(c == a); 

diese gedruckt werden:

false 
false 
true 

Also ich denke, dass in der Regel Sie bleiben wollen weg ‚==‘ bei einem Vergleich die Objekte

+0

Sie haben Recht. Dies ist das Ergebnis des Caching, das in der 'valueOf'-Methode implementiert wird. –

+0

Ja, aber amüsant nicht in Integer.valueOf (String s). Was für ein Chaos. –

Verwandte Themen