web-dev-qa-db-ja.com

Java.util.Listの任意の位置に挿入します

ドキュメントによると、リスト内の任意の位置にオブジェクトを挿入できます。

このインターフェイスのユーザーは、リスト内の各要素が挿入される場所を正確に制御できます。

(ソース: 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であるため、これには意味があります)。

インデックスが容量より低い限り、どの位置にもオブジェクトを挿入できないのはなぜですか?サイズは常に挿入された要素の数と同じですか?

20
fiskeben

任意のvalid位置にオブジェクトを挿入できます。 add(int, E) のJavadocをよく見てください:

スロー:
IndexOutOfBoundsException-インデックスが範囲外の場合(index < 0 || index > size())

つまり、要素を挿入すると、リストのサイズが常に1増加します。どちらの端または中央にでも挿入できますが、挿入はできませんpast終わり。

ArrayListcapacityは実質的に実装の詳細です。より多くの要素に対処するために、バッキング配列をより大きなものに置き換える必要がある場合を制御します。ここでは、リストのsizeが重要な部分です-容量100のリストですが、サイズ5はまだ5つの要素のリストであるため、そのようなリストの位置67に挿入します意味がありません。

27
Jon Skeet

リストの容量はサイズと同じではありません。

容量は、配列のバッキングリスト(ArrayListVectorなど)のプロパティであり、バッキング配列の割り当てサイズ(つまり、前に置くことができるアイテムの最大数)です。構造を成長させる必要がある)。

あなたが言うように、サイズはリストに存在する要素の数です。

それでは、スペースがあればどこにでも要素を挿入できないのはなぜですか?シンプルです。なぜなら、Listインターフェイスはオブジェクトのバックアップ方法を指定していないため、LinkedListのようなものではできません。そのため、同種の(そして正しい)動作は、例外が発生したときに例外をスローすることです。

したがって、2つのオプションがあります。

  • 希望するサイズまでデフォルト値を追加して、リストを適切に初期化します。
  • nullが適切なデフォルト値である場合、配列を直接使用できます。
2
fortran

myList.add(2、 "herp")はmyList.add(1、 "herp")でなければなりません

リストのサイズが大きくなると、2ではなく1ずつ増えます。

1
Yuhua Liu

ArrayListには、容量とサイズの2つのメンバーがあります

capacityは基礎となる配列の長さ、sizeはArrayListが表す配列の長さです

そのため、リストにデータを追加する必要があります。そのため、ArrayList自体は、データを挿入したいサイズになります

0
Hachi

リストのサイズは、挿入された要素の数と常に等しくなります

Throws:
IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())

javadoc

0
pbanfi

最初にmyList.add(0, "herp")が挿入され、次にサイズがチェックされます。サイズは1ですが、2の位置に挿入しています。