23

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

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

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

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

4

6 に答える 6

30

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

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

つまり、要素を挿入すると、リストのサイズが常に1ずつ大きくなります。どちらの端または中央にも挿入できますが、最後を超えて挿入することはできません。

容量は、ArrayList事実上、実装の詳細です。より多くの要素に対応するために、バッキングアレイをより大きなアレイに置き換える必要がある場合を制御します。ここで重要なのはリストのサイズです。容量が100のリストですが、サイズ5はまだ5つの要素のリストにすぎないため、このようなリストの67番目の位置に挿入しても意味がありません。

于 2011-10-21T09:48:18.743 に答える
2

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

容量は、配列に裏打ちされたリスト(ArrayListまたはなどVector)のプロパティであり、バッキング配列に割り当てられたサイズ(つまり、構造を拡張する前に配置できるアイテムの最大数)です。

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

では、スペースがある限り、要素を好きな場所に挿入できないのはなぜですか?インターフェースはオブジェクトのバックアップ方法を指定しておらず、 ;Listのようなものではそれを行うことができなかったため、単純です。LinkedListしたがって、同種の(そして正しい)動作は、それが発生したときに例外をスローすることです。

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

  • 希望のサイズまでデフォルト値を追加して、リストを適切に初期化します。
  • nullが適切なデフォルト値である場合は、配列を直接使用できます。
于 2011-10-21T09:47:29.393 に答える
2

myList.add(2、 "herp")はmyList.add(1、 "herp")である必要があります

リストのサイズが大きくなると、2ではなく1になります。

于 2011-10-21T10:02:30.157 に答える
0

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

容量は基になる配列の長さ、サイズはArrayListが表す配列の長さです

したがって、リストにデータを追加して、ArrayList自体がデータを挿入するサイズになるようにする必要があります。

于 2011-10-21T09:49:44.413 に答える
0

リストのサイズは常に挿入された要素の数と同じです

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

javadoc

于 2011-10-21T09:50:25.653 に答える
0

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

于 2011-10-21T11:04:27.827 に答える