Autoboxing Verständnis

Status
Nicht offen für weitere Antworten.

chrs

Mitglied
Hallo, wer erklärt mir folgendes Phänomen? Lasse ich die int Werte per Autoboxing in die Liste, ist es möglich im Comparator auf == zu prüfen.. Wieso? Es sind doch eigentlich Integer werde, denn sie sind nun in der Liste oder?

Code:
public class TestAutoBoxing {
    private static final class IntegerComparator implements Comparator<Integer> {

        private final String list;

        public IntegerComparator(String listName) {
            this.list = listName;
        }

        public int compare(Integer first, Integer second) {
            int result = -1;

            if (first > second) {
                result = 1;
            }
            else if (first == second) {
                System.out.println(this.list + " first == second ! ");
                result = 0;
            }
            return result;
        }
    }

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(new Integer(4));
        list.add(new Integer(10));
        list.add(new Integer(24));
        list.add(new Integer(4));
        list.add(new Integer(45));

        Comparator<Integer> naturalOrder = new IntegerComparator("Integer List");

        List<Integer> list2 = new ArrayList<Integer>();
        list2.add(4);
        list2.add(10);
        list2.add(24);
        list2.add(4);
        list2.add(45);

        Comparator<Integer> naturalOrder2 = new IntegerComparator("Autoboxed List");

        Collections.sort(list, naturalOrder);
        Collections.sort(list2, naturalOrder2);
    }
}
 
S

SlaterB

Gast
Autoboxing verwendet Integer.valueOf, siehe dort
oder auch dessen Quellcode:
Code:
    public static Integer valueOf(int i) {
	final int offset = 128;
	if (i >= -128 && i <= 127) { // must cache 
	    return IntegerCache.cache[i + offset];
	}
        return new Integer(i);
    }

---------


Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        Integer a = Integer.valueOf(3);
        Integer b = Integer.valueOf(3);
        Integer c = new Integer(3);
        System.out.println(a == b);
        System.out.println(a == c);
    }


}
 

tfa

Top Contributor
Seit Java 1.5 gibt es einen Integer-Cache für die Werte zwischen -128 und 127. Der wird beim Autoboxing (und Integer.valueOf(n)) benutzt, nicht aber bei new Integer(n).
 
M

maki

Gast
Eines der Probleme mit Dingen die mit Auto- anfangen, ist, das es nicht offensichtlich ist, was genau passiert, erst wenn man genauer hinsieht bzw. den Source untersucht.
 

Wildcard

Top Contributor
Bei Autoboxing wird Integer#valueOf und nicht new Integer verwendet.
Die ersten 255 Integers werden von Java in einem Cache vorgehalten, daher kann auf Identität geprüft werden.
Sollte man natürlich tunlichst vermeiden, da es ab 256 fehlschlägt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Sonecc AutoBoxing Kritik auf wikipedia - Frage Allgemeine Java-Themen 9
S Autoboxing Allgemeine Java-Themen 13
S Autoboxing Allgemeine Java-Themen 2
S Autoboxing in Genrics Allgemeine Java-Themen 4
G Frage zu Autoboxing Allgemeine Java-Themen 6
B Autoboxing und Eclipse Allgemeine Java-Themen 4
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
H Mathematisch fehlendes Verständnis (3D-Denken) Allgemeine Java-Themen 14
A Hilfe beim Verständnis Allgemeine Java-Themen 16
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
parrot Verständnis des Codes Allgemeine Java-Themen 3
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
M True or false Verständnis Allgemeine Java-Themen 5
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
J Josephus Verständnis Allgemeine Java-Themen 1
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
H Erste Schritte Beispiele zum Verständnis Allgemeine Java-Themen 3
T Input/Output Verständnis: Wo wird das File auf die Festplatte gepackt? Allgemeine Java-Themen 4
B Hilfe beim Verständnis von Mergesort Allgemeine Java-Themen 5
C int zu byte cast - verständnis Allgemeine Java-Themen 3
M Verständnis enum - switch Allgemeine Java-Themen 2
M Verständnis "synchronized" Allgemeine Java-Themen 4
C Verständnis zur Strukturierung von Java-Projekten/Interfaces Allgemeine Java-Themen 2
S Probleme mit dem allgemeinen Verständnis zuverrebung usw. Allgemeine Java-Themen 6
S Verständnis Problem - Classpath Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben