Frage
public class WrapperTest {
public static void main(String[] args) {
Integer i = 100;
Integer j = 100;
if(i == j)
System.out.println("same");
else
System.out.println("not same");
}
}
Der obige Code gibt die Ausgabe von same
wenn ausführen, aber wenn wir den Wert von i
und j
bis 1000 die Ausgänge Änderungen not same
ändern. Da ich für SCJP bereite mich darauf vor, müssen das Konzept hinter dieser klaren zu bekommen. Kann jemand dieses behavior.Thanks erklären.
Lösung
In Java Ganzen Zahlen zwischen -128 und 127 (einschließlich) werden in der Regel durch die gleiche Integer-Objekt-Instanz dargestellt. Dies wird durch die Verwendung eines inneren Klasse genannt IntegerCache (enthalten in der Integer-Klasse und wird verwendet, wenn z.B. Integer.valueOf () aufgerufen wird, oder bei der Autoboxing) behandelt:
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
Siehe auch: http://www.owasp.org/index.php / Java_gotchas
Andere Tipps
Im Grunde Ganze Zahlen zwischen -127 und 127 sind ‚zwischengespeichert‘ so, dass, wenn Sie diese Zahlen verwenden Sie immer auf die gleiche Anzahl im Speicher verweisen, weshalb Ihre ==
Werke ist.
Jeder Integer außerhalb dieses Bereichs werden nicht zwischengespeichert, so dass die Referenzen sind nicht das gleiche.
@tunaranch ist richtig. Es ist auch das gleiche Problem wie in diesem Python Frage . Der Kern ist, dass Java ein Objekt um für die ganzen Zahlen von -128 bis 127 (Python tut -5 bis 256) hält und gibt das gleiche Objekt jedes Mal, wenn Sie darum bitten. Wenn Sie außerhalb dieser festgelegten Bereichs für eine ganze Zahl fragen, wird es geben Sie ein neues Objekt jedes Mal.
(Es sei daran erinnert, dass ==
gibt zurück, ob zwei Objekte wirklich gleich, während equals
dessen Inhalt miteinander vergleichen.)
Bearbeiten : Hier ist der relevante Abschnitt von Abschnitt 5.1.7 des Java Language Specification
Wenn der Wert p geschachtelt werden
true
ist,false
, einbyte
, einchar
im Bereich\u0000
\u007f
oder ein int oder kurz Zahl zwischen -128 und 127, dann lassen r1 und r2 werden die Ergebnisse von jeweils zwei Boxen Umwandlungen von p. Es ist immer der Fall, dass r1 == r2 .
Beachten Sie, dass dies beschreibt auch, was mit anderen Arten geschieht.
Es ist mit Gleichheit und Autoboxing zu tun: http://web.archive.org/web/20090220142800/http://davidflanagan.com/2004/02/equality-and-autoboxing.html
Ihr Code nicht kompiliert. Dies ist, was ich bekommen:
Exception in thread "main" java.lang.Error: Ungelöste Kompilierungsproblemen: Typenkonflikt: kann nicht von int Integer konvertieren Typenkonflikt: Konvertierung von int Integer
at WrapperTest.main(WrapperTest.java:5)
Variablen i und j sind Instanzen von Integer-Objekt. Sie keine Instanzen von Objekt vergleichen mit „==“ Operator verwenden „gleich“ Verfahren statt.
Grüße