Während Array.asList(...)
nur ein Dektorator ist, der ein Array so aussehen lässt, als wäre es eine List
, übertragen drei überladene Methoden toArray(...)
aus Collection
alle Elemente einer Sammlung auf eine Liste:
Object[] toArray()
<T> T[] toArray(T[] a)
default <T> T[] toArray(IntFunction<T[]> generator)
(Java 11)
Was ist das Ergebnis der Ausgabe?
List<String> list = new ArrayList<>( Arrays.asList( "a", "b" ) );
System.out.println( list.toArray()[ 0 ] );
System.out.println( list.toArray( new String[ 0 ] )[ 0 ] );
System.out.println( list.toArray( new String[ 0 ] ).length );
System.out.println( list.toArray( new String[ 1 ] )[ 0 ] );
System.out.println( list.toArray( new String[ 1 ] ).length );
System.out.println( list.toArray( value -> new String[ 1 ] )[ 0 ] );
System.out.println( list.toArray( value -> new String[ 1 ] ).length );
System.out.println( list.toArray().getClass() );
System.out.println( list.toArray( new String[ 0 ] ).getClass() );
Lösung .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
List<String> list = new ArrayList<>( Arrays.asList( "a", "b" ) );
System.out.println( list.toArray()[ 0 ] ); // a
System.out.println( list.toArray( new String[ 0 ] )[ 0 ] ); // a
System.out.println( list.toArray( new String[ 0 ] ).length ); // 2
System.out.println( list.toArray( new String[ 1 ] )[ 0 ] ); // a
System.out.println( list.toArray( new String[ 1 ] ).length ); // 2
System.out.println( list.toArray( value -> new String[ 1 ] )[ 0 ] ); // a
System.out.println( list.toArray( value -> new String[ 1 ] ).length ); // 2
System.out.println( list.toArray().getClass() ); // class [Ljava.lang.Object;
System.out.println( list.toArray( new String[ 0 ] ).getClass() ); // class [Ljava.lang.String;
Es hilft beim Verständnis sich den Code aus dem OpenJDK anzuschauen:
Aus der OpenJDK-Implementierung von java.util.ArrayList
:
public Object[] toArray() {
return Arrays.copyOf( elementData, size );
}
Aus der OpenJDK-Implementierung von java.util.ArrayList
:
public T[] toArray( T[] a ) {
if ( a.length < size ) // Make a new array of a’s runtime type, but my contents: return (T[]) Arrays.copyOf( elementData, size, a.getClass() ); System.arraycopy( elementData, 0, a, 0, size ); if ( a.length > size )
a[ size ] = null;
return a;
}
Aus der OpenJDK-Implementierung von java.util.Collection
:
default T[] toArray( IntFunction generator) {
return toArray(generator.apply(0));
}