Exemplarerzeugungsausdrücke von »java.lang.Integer«
Der Exemplarerzeugungsausdruck »new java.lang.Integer( 2 )« referenziert wie der Methodenaufruf »java.lang.Integer.valueOf( 2 )« ein java.lang.Integer-Objekt, das den int-Wert »2« darstellt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.Integer v2 = java.lang.Integer.valueOf( 2 );
final java.lang.Integer n2 = new java.lang.Integer( 2 );
java.lang.System.out.println( v2 );
java.lang.System.out.println( n2 );
java.lang.System.out.println( v2.equals( n2 ));
java.lang.System.out.println( v2 == n2 ); }}transcript
2
2
true
false
Wenn ein Exemplar mit einem Exemplarerzeugungsausdruck referenziert wird, wird bei jeder Auswertung des Exemplarerzeugungs ein neues Exemplar angelegt. Während es nicht sicher ist, ob mehrere Auswertungen des Ausdrucks »java.lang.Integer.valueOf( 201 )« immer dasselbe Objekt ergeben, ist es also sicher, daß mehrere Auswertungen des Ausdrucks »new java.lang.Integer( 201 )« immer ein neues (anderes) Objekt ergeben, daher kommt ja auch das Schlüsselwort »new«. Dies ist bei einem Aufruf der Methode »java.lang.Integer.valueOf« nicht garantiert: sie kann auch eine Referenz auf ein Exemplar zurückgeben, das schon vor dem Aufruf existierte. Daher ist ihr Aufruf vermutlich in der Regel effizienter als eine Auswertung eines Exemplarerzeugungsausdrucks.
In der Regel sollte also der Ausdruck »java.lang.Integer.valueOf( 2 )« und nicht der Ausdrucks »new java.lang.Integer( 2 )« verwendet werden, wenn eine Referenz auf eine Objektdarstellung des int-Wertes »2« benötigt wird.
Übungsfragen
? Gleichheit von java.lang.Integer-Objekten
Was gibt das folgende Programm aus?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.Object a = new java.lang.Integer( 201 );
final java.lang.Object b = new java.lang.Integer( 201 ); java.lang.System.out.println( a == b ); }}