4

不一致があると感じているので、リストの定義とJavaでの実装を比較しようとしています。

リスト DataStructureの定義: リストまたはシーケンスは、順序付けられた値のコレクションを実装する抽象データ型であり、同じ値が複数回発生する可能性があります。[出典:http: //en.wikipedia.org/wiki/List_(abstract_data_type) ]

順序付けされたコレクションは、要素の挿入順序を維持するようになりました。

List の Java 実装 -> ArrayList : この実装によると、次の点があります。

  1. たとえばサイズ 5 のを初期化するArrayListと、順序付けの原則に反するため、位置 1、2、3、4 に要素を挿入せずに要素を 5 番目の位置に直接挿入することはできません。したがって、Javaはここで例外を与えますが、これには完全に同意します。
  2. ArrayList「set(int index, E element)」や「add(int index, E element)」などのメソッドを提供し、リストの途中で要素を置換したり、リストの途中に新しい要素を挿入したりできます。ぜんぜんわかりません。掲載順が守られていないため、順序付けの原則に反します。

1 点目と 2 点目は矛盾しているように感じます。

ここでの私の理解のどこが間違っているのか、誰か説明してもらえますListか?

4

6 に答える 6

2
  1. この定義では、リストのサイズや、要素をインデックスで追加したときに何が起こるかについては何も述べていません。要素の順序が「突然」変更されないことを示しているだけです。

    これは、新しい要素を追加することで要素の順序を変更できる「セット」型とは対照的です。要素が 5 つのリストの 2 番目の位置に要素を挿入すると、3 番目の要素が突然リストの先頭にジャンプすることはありません。

  2. また、この定義は、どの操作が必要かを示しているのではなく、何を持っている可能性があるかのみを示しています。リストを効率的に操作するには、要素をどこにでも (もちろん、正当な境界内で) 挿入し、既存の要素のインデックスを変更せずに要素を置き換えることができるメソッドがあると便利です

    2 番目の操作が欠落している場合、実装によっては、要素の置換にadd()プラスがかかりremove()、どちらもコストのかかる操作になります。

    また、どちらの操作も、適用時に他の要素の順序にどのように影響するかを明確に説明しています。挿入ポイントの後のすべての要素のインデックスをインクリメントしset()ながら、他の要素の順序を変更しません。add()

于 2013-04-26T10:11:20.590 に答える
1

ArrayList、 と同様java.util.Listに、要素の挿入順序を維持します。

空の があるとしましょうArrayList。A、B、C の順に追加します。リストは次のようになります[A, B, C]。もありませ[C, A, B][A, C, B]。ここで、インデックス 1 に D を挿入すると、リストは次のようになります[A, D, B, C][A, B, C, D]他のタイプの s では完全に可能である可能性がありますCollection

Javaは、コレクションListのような人為的な要素の順序付けSortedも、特定のコレクションのようなランダムな要素の順序付けも意味しませんHashSet

于 2013-04-26T11:15:10.780 に答える