2

Deitel Harvey の本を使用して Java ジェネリック コレクションの学習を開始しましたが、以下の 3 行のコードを理解するのに苦労しています。配列 (色) の関連する値を初期化して LinkList に追加することにより、それらすべてが同じ操作を実行します。変数 (list1)。2番目の方法と3番目の方法はどのように機能しますか-配列をリストとして表示する方法を理解するのに少し苦労しています.配列は動的データ構造ではないことを知っているので、長さは固定されているため、配列の要素を追加/削除することはできません一般にリストと比較して実行時間で行われます。

String[] colors = { "black", "white", "blue", "cyan" };
List< String > list1 = new LinkedList< String >();

// method 1 of initalizing and adding elments to the list
for (String color : colors)
    list1.add(color);

// method 2 of initializing and adding elements to the list
List< String > list1 = new LinkedList< String > (Arrays.asList(colors));

// method 3 of initializing and adding elements to the list
List< String > list1 = Arrays.asList(colors);

上記の質問を理解するのを手伝ってください。私はまだこれに慣れていないので、私を判断しないでください。ありがとう、シナン

4

7 に答える 7

3

実際、この質問に答えるのにジェネリックの知識は必要ありません。

正しく識別子配列は、要素を追加したり削除したりできないという意味で静的です。

ただし、リストは通常​​、これらの操作を許可します。

Listによって返されるに/メソッドがあります(そうでない場合は有効ではありません)。ただし、実際にこれらのメソッドを呼び出すと、配列に要素を実際に追加できないため、正確にスローされます(これは単にビュー/ラッパーです)。Arrays.asList() addremoveListUnsupportedOperationExceptionList

リストを構造的に変更しない(つまり、リスト内の要素の数を変更しない)操作は完全に可能です。によって返されるによってset(int, E)正常に機能します。ListArrays.asList()

于 2012-10-09T14:36:12.563 に答える
2

Arrays.asList指定された配列に基づく固定サイズのリストを返します。

実際には、Array フレームワークと Collection フレームワークの間のブリッジです。しかし、返されたリストは配列に書き込んでいます。

于 2012-10-09T14:35:06.177 に答える
2

LinkedList最初に に割り当てたに対して何かを実行するのは、最初のメソッドだけですlist1。他の 2 つは、関連のない新しいリストをそれに割り当てます。3 番目のオプションは、 ではなく、 String 配列によってサポートされるインターフェイスLinkedListの特別な実装を割り当てます。List3 番目のケースでは、リストから要素を追加/削除することはできませんが、それを反復して既存のスロットを更新することはできます。基本的に、単純な配列と同じように、Listインターフェイスを介して実行します。

于 2012-10-09T14:35:44.290 に答える
1

Arrays.asList配列からリストを作成します。一般に、配列はJavaではリストとして表示できません。それらはリストでのみラップできます。

したがってLinkedList、この場合、メソッド2を使用して特定のリストを実装します。

于 2012-10-09T14:35:58.403 に答える
1

方法 2 にするには、ここで Api を確認してください: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/LinkedList.html#LinkedList(java.util.Collection ) Collections Interface を実装して、このコンストラクターがここで機能するようにします。

方法 3 では、ここで Api を確認してください: http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T ...)

于 2012-10-09T14:37:51.617 に答える
0

実装に興味があるときはいつでも、特定の方法を調べることができます。たとえば、Ctrlキーを押しながらマウスの左ボタンを押してメソッドまたはクラスに移動します。

// method 2 of initializing and adding elements to the list
List<String> list1 = new LinkedList<String> (Arrays.asList(colors));

このコードは次のようになります。

List<String> list1 = new LinkedList<String> (new ArrayList<String>(colors));

のコンストラクターでArrayList

ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
        a = array;
    }

実際の配列は、カプセル化されたプライベート配列フィールドにコピーされます(リンクがコピーされます)。

次に、コンストラクターでLinkedList

public LinkedList(Collection<? extends E> c) {
    this();
    addAll(c);
    }

渡されたコレクションのすべての要素がに追加されLinkedListます。

于 2012-10-09T14:50:15.723 に答える
0

以下のリンクが表示される場合 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/LinkedList.html#LinkedList%28java.util.Collection%29

コレクションオブジェクトをパラメーターとして受け入れるリンクリストクラスのコンストラクターが表示されます。

あなたの投稿では、2行目と3行目はコレクションクラスのオブジェクトを渡しています(つまり、Arrays.asListは最終的にコレクションのサブクラスであるListを与えています)。

したがって、2行目と3行目の両方がかなり有効な実装です。さらに、3 行すべてでもう 1 つの優れたコーディング プラクティスを確認できます。あれは

クラスではなくインターセプターにコードを書く

. (参照

リンクされたリスト

のインスタンス

リスト

インターフェース)

常にインターセプターを使用してクラスを参照するようにしてください。これは良い習慣です

于 2012-10-09T15:01:46.377 に答える