Zitat
Das stimmt nicht, der Compiler optimiert das alles wieder so, dass das Kompilat mit echten Integern arbeitet. Übrigens sind bei Java ab 1.5 imho auch alles automatisch Objekte. Was auch echt praktisch ist, da sich so viel leichter Objektorientiert arbeiten lässt.
Jein.
Aus Sicht des Programmierers können ints (und andere Grundtypen) in C# und Java 1.5 wie Objekte behandelt werden.
Diese Sprachen+Compiler unterstützen sogenanntes Auto-Boxing. D.h. die Werte der Grundtypen sind nach wie vor keine Objekte -- wenn sie jedoch an einer Stelle übergeben werden, an der ein Objekt erwartet wird (z.B. beim Speichern in einen Container), erkennt der Compiler dies und erzeugt transparent das passende Wrapper-Objekt. Wird dieses Wrapper-Objekt nun an einer Stelle übergeben, an der wieder der Wert des Grundtyps erwartet wird, wird der Wert automatisch aus diesem extrahiert.
Letztendlich ist es nur syntaktischer Komfort... "myContainer.Add( myInt )" ist nur eine bequemere Schreibweise für "myContainer.Add( new Integer(myInt) )".
Die Performanz wird dadurch nicht automatisch besser, nur sieht der Programmierer das Erzeugen und Auflösen der Wrapper-Objekte nicht mehr im Code. Das ist natürlich auch eine Falle -- wenn beispielsweise in einer sehr oft durchgeführten kurzen Schleife ints in einen Container gesteckt werden, kann die Performanz durch das hierbei stattfindende automatische Boxing (=Erzeugen der Integer-Wrapper um die ints) beeinträchtigt werden.
Auf der anderen Seite ist natürlich die Performanz hoch, solange mit ints einfach nur gerechnet wird und kein Boxing/Unboxing stattfindet -- mit einem "echten" int rechnet es sich schneller als mit einem Integer-Objekt.
Hmm... ich hoffe das war einigermaßen verständlich 