Come posso inizializzare una ArrayList con tutti gli zeri in Java?


161

Sembra che arraylistnon stia facendo il suo lavoro per presiedere:

// presizing 

ArrayList<Integer> list = new ArrayList<Integer>(60);

Successivamente, quando provo ad accedervi:

list.get(5) 

Invece di restituire 0 genera IndexOutOfBoundsException: Index 5 fuori limite per la lunghezza 0 .

C'è un modo per inizializzare tutti gli elementi su 0 di una dimensione esatta come quello che fa C ++?


4
Il Javadoc di quel costruttore specifica che crea un "elenco vuoto". Sta facendo il suo lavoro.
ColinD

Risposte:


429

Il numero intero passato al costruttore rappresenta la sua capacità iniziale , ovvero il numero di elementi che può contenere prima di dover ridimensionare il suo array interno (e non ha nulla a che fare con il numero iniziale di elementi nell'elenco).

Per inizializzare un elenco con 60 zeri fai:

List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, 0));

Se si desidera creare un elenco con 60 oggetti diversi , è possibile utilizzare l'API Stream con Supplieril seguente:

List<Person> persons = Stream.generate(Person::new)
                             .limit(60)
                             .collect(Collectors.toList());

1
È molto meglio della mia soluzione (anche la mia aggiornata che funziona davvero hehehe). Consiglierei di non farne una nuova ArrayList, e invece di programmare semplicemente List. Questa è una decisione lasciata al PO, ovviamente.
corsiKa

6
L'elenco restituito da nCopiesè immutabile, quindi la creazione di un nuovo ArrayListè probabilmente una buona idea.
aioobe,

4
Fare attenzione che quando si utilizza il nCopiescon un oggetto complesso la raccolta non viene istanziata con 60 oggetti diversi, ma 60 volte con lo stesso oggetto. Quindi usa questo solo per i primitivi.
membri del

1
@membersound, posso pensare a molti scenari in cui nCopiesè utile con i tipi di riferimento: oggetti immutabili come stringhe, schemi di oggetti null, costanti di enum, ... Comunque, ho aggiornato la risposta con una soluzione per la creazione di 60 oggetti diversi.
aioobe,

@aioobe So che ci sono molti scenari in cui le copie sono utili. Volevo solo aggiungere questo, poiché ho provato le fotocopie con oggetti mutabili e sono rimasto sorpreso dal fatto che non funzionasse come mi aspettavo. Nel caso in cui qualcuno provi lo stesso compito. grazie per l'aggiornamento però!
membri del

12
// apparently this is broken. Whoops for me!
java.util.Collections.fill(list,new Integer(0));

// this is better
Integer[] data = new Integer[60];
Arrays.fill(data,new Integer(0));
List<Integer> list = Arrays.asList(data);

2
Questo riempie solo un elenco di voci esistenti. Non lo inizializzerà con gli elementi come desiderato.
WhiteFang34

Questo non riempirà la lista con 60 zeri.
aioobe,

Anche se creerebbe 60 oggetti dove non è necessario crearne nessuno.
ColinD

1
@Frost: otterrai un IndexOutOfBoundsExceptionconList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
WhiteFang34

2
Arrays.asListproduce un Listche non consente l'aggiunta o la rimozione, quindi non è esattamente lo stesso di quello che l'OP vuole. Funzionerebbe se tutto ciò che devi fare è set, ma potresti essere meglio di usare un array in quel caso.
ColinD

8

Il 60 che stai passando è solo la capacità iniziale per la memoria interna. È un suggerimento su quanto pensi possa essere grande, ma ovviamente non è limitato da quello. Se è necessario preimpostare i valori, è necessario impostarli da soli, ad esempio:

for (int i = 0; i < 60; i++) {
    list.add(0);
}

4

Implementazione Java 8 (Elenco inizializzato con 60zero) :

List<Integer> list = IntStream.of(new int[60])
                    .boxed()
                    .collect(Collectors.toList());
  • new int[N] - crea un array pieno di zero e lunghezza N
  • boxed() - ogni elemento inscatolato in un intero
  • collect(Collectors.toList()) - raccoglie elementi del flusso

0

Non è così. ArrayList utilizza semplicemente l'array come respentation interno. Se aggiungi più di 60 elementi, l'array di underlay verrà esaurito. Tuttavia, è possibile aggiungere a questo array quanti più elementi RAM hai.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.