Warum dieser Code eine IndexOfOutBoundsException werfen - aka, was los ist mit ensureCapacity ()?

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

  •  10-07-2019
  •  | 
  •  

Frage

die beiden folgenden Code-Schnipsel vor:

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

und

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

Im ersten Fall, ich bin nicht überrascht, ein IndexOfOutBoundsException zu sehen. Nach der API , add(int index, E element) wird ein IndexOfOutBoundsException „wenn der Index außerhalb des zulässigen Bereichs (index < 0 || index > size()) ist“ werfen. Die Größe der strings 0 bevor Elemente hinzugefügt wurden, so Index wird auf jeden Fall größer sein als die Arraylist Größe.

Doch im zweiten Fall würde ich den Anruf erwartet ensureCapacity strings so wachsen, dass der Anruf richtig die Zeichenfolge add bei Index 676 einfügen würde "foo" -. Aber es funktioniert nicht

  1. Warum nicht?

  2. Was soll ich tun, damit add(index, "foo") arbeitet für index > strings.size()?

War es hilfreich?

Lösung

Die Kapazität des darunterliegenden Arrays in einem Arraylist unterscheidet sich von den übergeordneten Liste API-Methoden (Hinzufügen, Entfernen, etc.), und spricht nur auf die Größe der Trägeranordnung. Wenn Sie Elemente über die Liste Grenzen zulassen wollen hinzufügen, müssen Sie das selbst kodieren (oder eine Sammlung finden, die es für Sie tut) in einer Utility-Klasse, nulls, leere Objekte bevölkern, oder was auch immer Ihre Anwendung erwartet zwischen dem neuen Index und die alte Größe.

Andere Tipps

ArrayList.ensureCapacity () nicht die tatsächliche Größe der Liste ändern (die nach Größe () zurückgegeben wird), sondern den internen Puffer neu zuzuordnen, so dass sie nicht den Puffer auf diese Größe zu wachsen, neu zu verteilen müssen (wenn Sie rufen list.add (Objekt).

/**
 * 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.
 */

eine wilde Vermutung nehmen, denke ich, was Sie suchen ist

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

Ihre Länge beträgt 676, aber man muss bedenken, dass sie Null basiert sind, so in der Realität, dann würden Sie indizieren möchten -1 würde Ihre maximale Anzahl sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top