Perché questo codice genera un IndexOfOutBoundsException - ovvero, che succede con sureCapacity ()?

StackOverflow https://stackoverflow.com/questions/1644741

  •  10-07-2019
  •  | 
  •  

Domanda

Considera i seguenti due frammenti di codice:

int index = 676;
List<String> strings = new ArrayList<String>();
strings.add(index, "foo");

e

int index = 676;
List<String> strings = new ArrayList<String>();
strings.ensureCapacity(index);
strings.add(index, "foo");

Nel primo caso, non sono sorpreso di vedere IndexOfOutBoundsException. Secondo la API , add(int index, E element) genererà una quotazione IndexOfOutBoundsException &; Se l'indice non rientra nell'intervallo (index < 0 || index > size()) & Quot ;. La dimensione di strings è 0 prima che siano stati aggiunti elementi, quindi l'indice sarà sicuramente più grande della dimensione dell'ArrayList.

Tuttavia, nel secondo caso, mi aspetto che la chiamata a ensureCapacity cresca add in modo tale che la chiamata a "foo" inserisca correttamente la stringa add(index, "foo") all'indice 676, ma non è così.

  1. Perché no?

  2. Cosa devo fare in modo che index > strings.size() funzioni per <=>?

È stato utile?

Soluzione

La capacità dell'array sottostante in un ArrayList è distinta dai metodi API List di livello superiore (aggiungi, rimuovi, ecc.) e parla solo delle dimensioni dell'array di supporto. Se vuoi consentire l'aggiunta di elementi oltre i limiti dell'elenco, dovrai codificarlo tu stesso (o trovare una raccolta che lo fa per te) in una classe di utilità, popolando null, oggetti vuoti o qualunque cosa la tua applicazione si aspetti tra i nuovi indice e le dimensioni precedenti.

Altri suggerimenti

ArrayList.ensureCapacity () non modifica le dimensioni effettive dell'elenco (che viene restituito da size ()), ma piuttosto rialloca il buffer interno in modo tale che non sarà necessario riallocare il buffer per crescere a questa dimensione (quando chiamate list.add (oggetto).

/**
 * Increases the capacity of this <tt>ArrayList</tt> instance, if
 * necessary, to ensure that it can hold at least the number of elements
 * specified by the minimum capacity argument.
 */

Provando a indovinare, penso che quello che stai cercando sia

Integer index = Integer.valueOf(676);
Map<Integer,String> strings = new HashMap<Integer,String>();
strings.put(index, "foo");

la tua lunghezza è 676, ma devi ricordare che sono basati su zero, quindi in realtà, vorresti che l'indice -1 fosse il tuo numero massimo.

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