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.

War es hilfreich?

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, ein byte, ein char 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.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top