1. ホーム
  2. java

[解決済み] Arrays.asList(array)とnew ArrayList<Integer>(Arrays.asList(array)) の違いについて

2022-03-03 15:43:15

質問

とはどのような違いがあるのでしょうか?

  • 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));

解決方法は?

  1. まず、これが何をするものなのかを見てみましょう。

    Arrays.asList(ia)
    
    

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

    リストラッパーは ArrayList - というのは、別の種類のオブジェクトです。 ArrayList は独自の内部配列を持っており、そこに要素を格納し、内部配列のサイズを変更することができます。ラッパーは独自の内部配列を持たず、与えられた配列にのみ操作を伝搬します。

  2. 一方、その後に新しい配列を

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

    を作成した後、新しい ArrayList これは、元のものの完全な独立したコピーです。しかし、ここでは、ラッパーを Arrays.asList を構築している間だけ使用されます。 ArrayList その後、ゴミとして回収される。この新しい ArrayList は、元の配列とは完全に独立しています。同じ要素が含まれています (元の配列とこの新しい ArrayList はメモリ上の同じ整数を参照します)、その参照を保持する新しい内部配列を作成します。そのため、シャッフルしたり、要素を追加したり削除したりしても、元の配列は変更されません。