132

違いは何ですか

  • List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(ia)); // Copy

  • List<Integer> list2 = Arrays.asList(ia);

ia整数の配列はどこですか?

で一部の操作が許可されていないことを知りましたlist2。なぜそうなのですか?どのようにメモリに保存されますか (参照/コピー)?

リストをシャッフルするとlist1、元の配列には影響しませんが、影響list2します。しかし、まだlist2やや混乱しています。

ArrayListリストにアップキャストされることと、新しい を作成することの違いは何ArrayListですか?

list1 differs from (1)
ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(ia));
4

13 に答える 13

252
  1. まず、これが何をするか見てみましょう:

    Arrays.asList(ia)
    

    配列を取り、iaを実装するラッパーを作成しますList<Integer>。これにより、元の配列がリストとして使用できるようになります。何もコピーされず、単一のラッパー オブジェクトのみが作成されます。リスト ラッパーに対する操作は、元の配列に反映されます。つまり、リスト ラッパーをシャッフルすると、元の配列もシャッフルされ、要素を上書きすると、元の配列で上書きされます。もちろん、List追加やリストから要素を削除すると、要素の読み取りまたは上書きのみが可能になります。

    リスト ラッパーは拡張されないことに注意してくださいArrayList。これは別の種類のオブジェクトです。ArrayLists には、要素を格納する独自の内部配列があり、内部配列などのサイズを変更できます。ラッパーには独自の内部配列がなく、指定された配列に操作を伝達するだけです。

  2. 一方、その後新しい配列を次のように作成すると、

    new ArrayList<Integer>(Arrays.asList(ia))
    

    ArrayList次に、元の完全な独立したコピーであるnew を作成します。ここでも使用してラッパーを作成しますがArrays.asList、これは new の構築中にのみ使用され、ArrayList後でガベージ コレクションされます。この新しい配列の構造はArrayList、元の配列から完全に独立しています。これには同じ要素が含まれます (元の配列とこの新しい配列の両方ArrayListがメモリ内の同じ整数を参照します) が、参照を保持する新しい内部配列を作成します。したがって、シャッフル、要素の追加、削除などを行っても、元の配列は変更されません。

于 2013-05-25T09:27:19.150 に答える
30

これは、ArrayListresults fromArrays.asList()が 型ではないためjava.util.ArrayListです。

Arrays.asList()を拡張せず、拡張するだけArrayListの型を作成します。java.util.Arrays$ArrayListjava.util.ArrayListjava.util.AbstractList

于 2013-05-25T09:13:13.140 に答える
9
List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(ia));  //copy

この場合、list1タイプはArrayListです。

List<Integer> list2 = Arrays.asList(ia);

ここでは、リストはListビューとして返されます。つまり、そのインターフェイスにアタッチされたメソッドのみが含まれています。したがって、一部のメソッドが で許可されていないのはなぜですかlist2

ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(ia));

ここでは、新しい作成していますArrayList。コンストラクターで値を渡すだけです。これはキャスティングの例ではありません。キャストでは、次のようになります。

ArrayList list1 = (ArrayList)Arrays.asList(ia);
于 2013-05-25T09:11:10.033 に答える
4

回答を探している人にとっては、ドキュメントの参照を含む説明が適しています。

1.java.util.Arrays _

  • これは、指定された配列を操作するための一連の静的メソッドを備えたユーティリティ クラスです。
  • asListは、入力配列を受け取り、List インターフェースを実装する AbstractList<E> を拡張する静的ネストされたクラスであるjava.util.Arrays.ArrayListのオブジェクトを返す静的メソッドの 1 つです。
  • したがって、Arrays.asList(inarray) は入力配列の周りに List ラッパーを返しますが、このラッパーはjava.util.Arrays.ArrayList であり、java.util.ArrayListではなく、同じ配列を参照するため、ラップされた List にさらに要素を追加します。配列は元の配列にも影響し、長さを変更することもできません。

2.java.util.ArrayList _

  • ArrayList にはオーバーロードされたコンストラクターがたくさんあります

     public ArrayList() - // Returns arraylist with default capacity 10
    
     public ArrayList(Collection<? extends E> c)
    
     public ArrayList(int initialCapacity)
    
  • したがって、Arrays.asList の返されたオブジェクト、つまり List(AbstractList) を上記の 2 番目のコンストラクターに渡すと、新しい動的配列が作成されます (この配列のサイズは、その容量よりも多くの要素を追加すると増加し、新しい要素も元の配列に影響を与えます) 元の配列の浅いコピー (浅いコピーとは、参照のみをコピーし、元の配列と同じオブジェクトの新しいセットを作成しないことを意味します)

于 2018-01-06T12:29:05.427 に答える
2

Java 8 では、上記の「ia」は int[] ではなく Integer[] でなければならないことに注意してください。int 配列の Arrays.asList() は、単一の要素を持つリストを返します。OP のコード スニペットを使用すると、コンパイラは問題をキャッチしますが、一部のメソッド ( Collections.shuffle() など) は暗黙のうちに期待どおりに動作しません。

于 2016-04-08T15:06:58.377 に答える
0

違いのまとめ -

newを使用せずにリストを作成すると、演算子 Arrays.asList() メソッドは次のことを意味するラッパーを返します。

  1. 追加/更新操作を実行できます。

  2. 元の配列で行われた変更は List にも反映され、その逆も同様です。

于 2016-03-18T15:00:42.520 に答える