ドキュメントによると、リスト内の任意の位置にオブジェクトを挿入できます。
このインターフェイスのユーザーは、リスト内の各要素が挿入される場所を正確に制御できます。
(ソース: http://download.Oracle.com/javase/6/docs/api/Java/util/List.html )
ただし、次のプログラムはIndexOutOfBoundsExceptionで失敗します。
import Java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> myList = new ArrayList<String>();
myList.add(0, "derp");
myList.add(2, "herp");
for (String s : myList) {
System.out.println("Le string: " + s);
}
}
}
初期容量を明示的に設定するのにも役立ちません(デフォルト値は10であるため、これには意味があります)。
インデックスが容量より低い限り、どの位置にもオブジェクトを挿入できないのはなぜですか?サイズは常に挿入された要素の数と同じですか?
任意のvalid位置にオブジェクトを挿入できます。 add(int, E)
のJavadocをよく見てください:
スロー:
IndexOutOfBoundsException-インデックスが範囲外の場合(index < 0 || index > size())
つまり、要素を挿入すると、リストのサイズが常に1増加します。どちらの端または中央にでも挿入できますが、挿入はできませんpast終わり。
ArrayList
のcapacityは実質的に実装の詳細です。より多くの要素に対処するために、バッキング配列をより大きなものに置き換える必要がある場合を制御します。ここでは、リストのsizeが重要な部分です-容量100のリストですが、サイズ5はまだ5つの要素のリストであるため、そのようなリストの位置67に挿入します意味がありません。
リストの容量はサイズと同じではありません。
容量は、配列のバッキングリスト(ArrayList
やVector
など)のプロパティであり、バッキング配列の割り当てサイズ(つまり、前に置くことができるアイテムの最大数)です。構造を成長させる必要がある)。
あなたが言うように、サイズはリストに存在する要素の数です。
それでは、スペースがあればどこにでも要素を挿入できないのはなぜですか?シンプルです。なぜなら、List
インターフェイスはオブジェクトのバックアップ方法を指定していないため、LinkedList
のようなものではできません。そのため、同種の(そして正しい)動作は、例外が発生したときに例外をスローすることです。
したがって、2つのオプションがあります。
null
が適切なデフォルト値である場合、配列を直接使用できます。myList.add(2、 "herp")はmyList.add(1、 "herp")でなければなりません
リストのサイズが大きくなると、2ではなく1ずつ増えます。
ArrayListには、容量とサイズの2つのメンバーがあります
capacityは基礎となる配列の長さ、sizeはArrayListが表す配列の長さです
そのため、リストにデータを追加する必要があります。そのため、ArrayList自体は、データを挿入したいサイズになります
リストのサイズは、挿入された要素の数と常に等しくなります
Throws:
IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())
最初にmyList.add(0, "herp")
が挿入され、次にサイズがチェックされます。サイズは1
ですが、2
の位置に挿入しています。