2016-03-19 11 views
1

Diese Frage kann trivial erscheinen, aber ich kann eine Lösung für dieses Problem für ein paar Tage nicht finden.Gibt es einen Unterschied zwischen Arrays.fill und tatsächlichen Füllung

Schnipsel 1:

for(int i = 0; i < arr.length; i++){ 
    arr[i] = new Bucket(); 
} 

Schnipsel 2:

Arrays.fill(arr, new Bucket()); 

Code mit Schnipsel 1 ausgeführt wird, wie erwartet, aber Code, der Schnipsel 2 enthält, wird alle Testfälle nicht vorbei.

Ich erwarte, dass beide Anweisungen die gleiche Arbeit intern erledigen. Aber die Testfälle zeigen, dass es nicht ist. Jede Hilfe, um dies zu klären, wird sehr hilfreich sein.

+0

Testfälle umfassen unsortierte Ganzzahl-Arrays – Rishi

Antwort

1

Arrays.fill() verwendet das gleiche Objekt aller Zeiten:

public static void fill(Object[] a, Object val) { 
    for (int i = 0, len = a.length; i < len; i++) 
     a[i] = val; 
} 

So gesamte Array mit einer einzigen Instanz einmal durch new Bucket()

4

über das, was sie denken erstellt gefüllt wird: Sie in der Schleife ein neues Objekt erstellen bei jeder Iteration. In der zweiten erstellen Sie ein Objekt und füllen Sie das Array damit. Sie sind total verschieden.

Von documentation:

Ordnet das angegebene Objekt Bezug auf jedes Element der spezifizierten Anordnung von Objekten.

+0

Perfekt .. Ich habe es verstanden. – Rishi

0

Ich erwarte, dass beide Anweisungen die gleiche Arbeit intern erledigen.

Snippet 2 erstellt nur eine Bucket und fügt jedem Slot dieselbe Instanz hinzu. So sind sie nicht das gleiche, in Java 8+ Sie ein Lambda und so etwas wie

IntStream.range(0, arr.length).forEach(x -> arr[x] = new Bucket()); 

die Bucket[] arr füllen nutzen könnten.

Verwandte Themen