Code von der Fachmesse “connecticum” 2008

Am Ende meines diesjährigen Besuchs bei der Connecticum 2008 an der FHTW konnte ich von der Firma “FF” aus München zwar keinen Praktikumsplatz abroad erhaschen (München war mir nicht Ausland genug ^^), dennoch war eine Frisbee-Scheibe drin mit folgender Rückseite:

a) Was gibt das folgende Java-Programm aus?

b) Warum ist das so?

public class Autoboxing {

public static void main (String[] args) {

Integer i, j;

i = 12;

j = 12;

System.out.println(“Test 1: “); System.out.println(i==j);

i = 234;

j = 234;

System.out.println(“Test 2: “); System.out.println(i==j);

}

}

Java-Jünger sollte ihren Spaß an der Lösung der Aufgabe haben? 😉

– Java ist nur für blöde Kaffee-Bohnen gut ^^

Tags: ,

2 Kommentare

  1. Martin sagt:

    Was kommt raus? 2x 234?

  2. alex sagt:

    ok – der Reihe nach.

    Die Ausgaben sind die folgenden:

    Test 1: true
    Test 2: false

    Bei dem Code handelt es sich um eine besondere Erscheinung in Java (seit 5). Man nennt es Boxing bzw. Autoboxing.

    Boxing bedeutet, dass automatisch ein Wrapper-Objekt erzeugt wird. Es ist also nicht eine normaler int hier, sondern die dazu gehörige Wrapper-Klasse INTEGER. Unboxing ist dann das Gegenteil.

    Die Klasse INTEGER kapselt den Wert einer Ganzzahl vom Typ int in einem Objekt.

    Wenn also i ein Objekt der Wrapperklasse INTEGER ist, wird eine Ganzzahl vom Typ int darin gespeichert.

    Macht man nun einen Vergleich mit == von auto-ge-box-ten primitiven intS, vergleicht man zwei Referenzen miteinander. Dabei erzeugt man aber mit jedem neuen Autoboxing neue Objekte.

    i=234;
    j=234;

    sind also nicht gleich, weil es unterschiedlichen Objekte sind. Man müsste also i.intValue() schreiben, um einen tatsächlichen Vergleich der Werte anstellen zu können.

    Nun ja, bei i=12 und j=12 funktioniert es doch auch (das Ergebnis ist true) – sind es dort nicht auch unterschiedliche Objekte? Die Frage ist berechtigt!

    Aber die Antwort ist:

    Wenn die Werte zwischen -128 und +127 liegen, sind sie gültig für solche Vergleiche – inklusive der Grenzwerte wohlgemerkt.

    Da 234 also außerhalb dieses Toleranzbereichs (nennt man auch Pool bzw. Pooling) liegt, den Sun freundlicherweise eingeräumt hat, muss der Referenzvergleich false ergeben.

    Ich hoffe es wurde deutlich.

    Erklärt ist das ganze auch beim eBook von Galileo Computing