Dimensione iniziale per l'ArrayList
-
29-10-2019 - |
Domanda
È possibile impostare la dimensione iniziale per un arraylist facendo
ArrayList<Integer> arr=new ArrayList<Integer>(10);
Tuttavia, non puoi farlo
arr.add(5, 10);
Perché provoca un'eccezione fuori limite.
Qual è l'uso dell'impostazione di una dimensione iniziale se non riesci ad accedere allo spazio che hai assegnato?
La funzione ADD è definita come add(int index, Object element)
Quindi non sto aggiungendo all'indice 10.
Soluzione
Stai confondendo le dimensioni dell'elenco degli array con la sua capacità:
- il taglia è il numero di elementi nell'elenco;
- il capacità è quanti elementi l'elenco può potenzialmente ospitare senza riallocare le sue strutture interne.
Quando chiami new ArrayList<Integer>(10)
, stai impostando la iniziale dell'elenco capacità, non le sue dimensioni. In altre parole, se costruito in questo modo, l'elenco degli array inizia la sua vita vuota.
Un modo per aggiungere dieci elementi all'elenco degli array è utilizzando un loop:
for (int i = 0; i < 10; i++) {
arr.add(0);
}
Detto questo, ora puoi modificare elementi sugli indici 0..9.
Altri suggerimenti
Se vuoi un elenco con una dimensione predefinita, puoi anche usare:
List<Integer> arr = Arrays.asList(new Integer[10]);
Se si desidera utilizzare Collections.Fill (elenco, OBJ); Per riempire l'elenco con un oggetto ripetuto in alternativa è possibile utilizzare
ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));
La linea copia 10 volte 0 pollici alla tua ArrayList
Capacità di un ArrayList
non è lo stesso del suo taglia. Dimensione è uguale al numero di elementi contenuti ArrayList
(e qualsiasi altro List
implementazione).
Il capacità è solo la lunghezza dell'array sottostante che viene utilizzato per archiviare internali gli elementi del ArrayList
, ed è sempre maggiore o uguale a taglia dell'elenco.
Quando si chiama set(index, element)
nell'elenco, il index
si riferisce al numero effettivo degli elementi dell'elenco (= dimensione) (che è zero nel codice, quindi il AIOOBE
viene lanciato), non alla lunghezza dell'array (= capacità) (che è un dettaglio di implementazione specifico per ArrayList
).
Il set
Il metodo è comune a tutti List
implementazioni, come LinkedList
, che non è effettivamente implementato da un array, ma come catena collegata di voci.
Modificare: In realtà usi il add(index, element)
metodo, no set(index, element)
, ma il principio è lo stesso qui.
Se si desidera aggiungere gli elementi con indice, potresti invece usare un array.
String [] test = new String[length];
test[0] = "add";
10 è la capacità iniziale di AL, non le dimensioni (che è 0). Dovresti menzionare la capacità iniziale di un valore elevato quando hai molti elementi, perché evita il sovraccarico di espandere la capacità mentre continui ad aggiungere elementi.
Immagino che una risposta esatta alla tua domanda sarebbe:
L'impostazione di una dimensione iniziale su un arraylist riduce il nr. Delle volte si deve verificare il riassegnazione della memoria interna. L'elenco è supportato da un array. Se si specifica la capacità iniziale IE 0, già al primo inserimento di un elemento, l'array interno dovrebbe essere ridimensionato. Se hai un'idea approssimativa di quanti elementi mancherebbe la tua lista, impostando la capacità iniziale ridurrebbe l'NR. di riassegnazioni di memoria che si verificano mentre si utilizza l'elenco.
Questo potrebbe aiutare qualcuno -
ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
Essere in ritardo a questo, ma dopo Java 8, Trovo personalmente questo approccio seguente con il Stream
API più concisa e può essere un'alternativa a la risposta accettata.
Per esempio,
Arrays.stream(new int[size]).boxed().collect(Collectors.toList())
dove size
è il desiderato List
dimensioni e senza lo svantaggio menzionato qui, tutti gli elementi nel List
sono inizializzati come 0
.
(Ho fatto una rapida ricerca e non ho visto stream
In qualsiasi risposta pubblicata - Sentiti libero di farmi sapere se questa risposta è ridondante e posso rimuoverla)
In questo momento non ci sono elementi nella tua lista, quindi non puoi aggiungere all'indice 5 dell'elenco quando non esiste. Stai confondendo la capacità dell'elenco con le sue dimensioni attuali.
Chiama soltanto:
arr.add(10)
Per aggiungere il numero intero al tuo arraylist
Sebbene il tuo arraylist abbia una capacità di 10, la vera lista non ha elementi qui. Il metodo ADD viene utilizzato per inserire un elemento nell'elenco reale. Dal momento che non ha elementi, non è possibile inserire un elemento all'indice di 5.
Se vuoi aggiungere 10 elementi al tuo ArrayList
Puoi provarlo:
for (int i = 0; i < 10; i++)
arr.add(i);
Se hai già dichiarato una variabile di dimensione dell'array, useresti la variabile size
Invece del numero '10'
Ho affrontato il problema simile e solo sapere che l'ArrayList è un'implementazione di Array ridotta dell'interfaccia dell'elenco, mi aspetto anche che tu possa aggiungere un elemento a qualsiasi punto, ma almeno ho la possibilità di definire la dimensione iniziale. Comunque, puoi prima creare un array e convertirlo in un elenco come:
int index = 5;
int size = 10;
Integer[] array = new Integer[size];
array[index] = value;
...
List<Integer> list = Arrays.asList(array);
o
List<Integer> list = Arrays.asList(new Integer[size]);
list.set(index, value);
ArrayList myList = new ArrayList (10);
// myList.add(3, "DDD");
// myList.add(9, "III");
myList.add(0, "AAA");
myList.add(1, "BBB");
for(String item:myList){
System.out.println("inside list : "+item);
}
/*Dichiarare la capsità iniziale di ArrayList non è altro che risparmiare tempo di spostamento internamente; Quando aggiungiamo l'elemento internamente, controlla la capacità per aumentare la capsità, è possibile aggiungere inizialmente l'elemento su 0 indice e così via. */
I miei due centesimi Stream
. Penso che sia meglio usare
IntStream.generate(i -> MyClass.contruct())
.limit(INT_SIZE)
.collect(Collectors.toList());
con la flessibilità di mettere eventuali valori iniziali.