Kurz gesagt,
- Die Linie
Integer in = (Integer)y;
verwendet eine unnötige gegossen. Die Zeile Integer in = new Integer(y);
erstellt eine Integer
Instanz.
Jeder Fall im Detail
Lassen Sie uns zunächst den Fall mit expliziten Gießen betrachten.
Integer i = (Integer)10;
Der Compiler versteht, dass 10
ist eine int
primitive Art und die Tatsache, dass es durch seine Integer
gewickelt werden muss es kompiliert zu machen. Es scheint, wird Javac folgend machen:
Integer i = (Integer)Integer.valueOf(10);
Aber der Compiler ist intelligent genug, um unnötiges Casting zu tun, (Integer)
wird nur verzichtet werden:
Integer i = Integer.valueOf(10);
Als nächstes gibt es den Fall mit Instanz-Schöpfung.
Integer i = new Integer(10);
Hier ist alles einfach. Eine neue Instanz der Klasse Integer
wird trotzdem erstellt. Aber, wie die Dokumentation sagt, ist es in der Regel nicht angemessen:
Es ist selten angemessen, diese Konstruktoren zu verwenden. Die statischen Fabriken valueOf()
sind im Allgemeinen eine bessere Wahl, da sie wahrscheinlich eine wesentlich bessere Raum- und Zeitleistung erbringen.
Fazit
Im täglichen Code schreiben, in der Regel wir autoboxing and unboxing verwenden. Sie sind automatische Konvertierungen zwischen den primitiven Typen und ihren entsprechenden Objekt-Wrapper-Klassen (wurde in Java 5 eingeführt). Sie müssen also nicht viel über die Methoden Xxx.valueOf(xxx)
und .xxxValue()
nachdenken. Es ist so bequem, oder?
Integer i = 10; // autoboxing
int j = i; // unboxing
Für diese Umwandlung sollten Sie 'Integer.valueOf()' verwenden. Aus dem Javadoc "Wenn eine neue Integer-Instanz nicht benötigt wird, sollte diese Methode im Allgemeinen dem Konstruktor Integer (int) vorgezogen werden, da diese Methode durch das Cachen des häufig angeforderten Werts" – Jens