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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top