最近、Java ArraysツールクラスのASLISTメソッドを分析し、関連情報をオンラインで整理し、読者を支援することを望んで記録しました。
アレイツールクラスはメソッドアスリストを提供します。これは、このメソッドを使用して、可変長パラメーターまたは配列をリストに変換します。
ソースコードは次のとおりです。
/***指定された配列に裏打ちされた固定サイズのリストを返します。 (返されたリスト「書き込み」を配列に変更します。)このメソッドは、{@linkコレクション#toarray}との組み合わせで、アレイベースとコレクションベースのAPIの間のブリッジとして機能します。返されたリストは * Serializableと実装{@link randomAccess}です。 * * <p>このメソッドは、いくつかの要素を含むように初期化された固定サイズのリストを作成する便利な方法も提供します。 * </ pre> * * @param aリストが裏付けられる配列 * @return指定された配列のリストビュー}問題の発見
上記の方法の説明に基づいて、まずいくつかの例を書きましょう。
/***@author wangmengjun**/public class arrayexample {public static void main(String [] args){/**変数長パラメーターを使用*/list <string> array1 = arrays.Aslist( "welceal"、 "to"、 "java"、 "world"); System.out.println(array1); / ** array*/ list <string> array2 = arrays.aslist(new String [] {"welcome"、 "to"、 "java"、 "world"}); System.out.println(array2); }}上記のプログラムを実行し、次のコンテンツを出力します。
[ようこそ、to、java、world]
[ようこそ、to、java、world]
気まぐれに、私は突然、作成されたリストに文字列「cool ~~~」を追加して、1つに行きたいと思いました。
/ **変数の長さパラメーターを使用*/ list <string> array1 = arrays.aslist( "welcome"、 "to"、 "java"、 "world"); array1.add( "cool ~~~");
その結果、UnsportedoperationExceptionが発生しました。
java.util.abstractlist.addのスレッド "main" java.lang.unsupportedoperationexceptionの例外java.util.abstractlist.add(unknown source)at test.arrayexample.main(arrayexample.java:36)の例外
信じられないほど、新しいarrayList <>(a)によって生成されたリストは、実際に問題に遭遇しました。
理由検索
質問は、何が正確に起こったのかということです。質問を使用して、ArrayListがArrays.Aslistで使用されているものを確認してください。
Aslist Method of Arraysで使用されるArrayListクラスは、java.util.arraylistクラスではなく、内部的に定義されたクラスであることがわかります。
ソースコードは次のとおりです。
/ ** * @serial include */ private static class arraylist <e> extends abstractlist <e> randomaccess、java.io.serializable {private static final long serialversionuid = -2764017481108945198l;プライベートファイナルe [] a; arrayList(e [] array){if(array == null)throw new nullpointerexception(); a =配列; } public int size(){return a.length; } public object [] toarray(){return a.clone(); } public <t> t [] toarray(t [] a){int size = size(); if(a.length <size)return arrays.copyof(this.a、size、(class <?extends t []>)a.getclass()); System.ArrayCopy(this.a、0、a、0、size); if(a.length> size)a [size] = null; aを返します。 } public e get(int index){return a [index]; } public e set(int index、e element){e oldvalue = a [index]; a [index] = element; OldValueを返します。 } public int indexof(object o){if(o == null){for(int i = 0; i <a.length; i ++)if(a [i] == null)return i; } else {for(int i = 0; i <a.length; i ++)if(o.equals(a [i]))return i; } return -1; } public boolean contains(object o){return indexof(o)!= -1; }}この内部クラスアレイリストの実装から、抽象クラスjava.util.abstractlist <e>を継承していることがわかりますが、追加方法と削除メソッドはオーバーライドされず、特定の実装は与えられていません。
ただし、デフォルトでは、java.util.abstractListクラスは、追加、設定、および削除でUnsupportedoperationExceptionを直接スローします。 AbstractListのソースコードの一部は次のとおりです。
パブリックアブストラクトクラスAbstractList <e> extends AbstractCollection <e> explments list <e> { /*** soleコンストラクター。 (サブクラスコンストラクターによる呼び出しの場合、通常は *暗黙的です。) } /** * {@inheritdoc} * * <p>この実装は、常に * {@code unsupportedoperationexception}をスローします。 * * @throws UnsupportedOperationException {@inheritDoc} * @throws ClassCastException {@inheritDoc} * @throws NullPointerException {@inheritDoc} * @throws IllegalArgumentException {@inheritDoc} * @throws IndexOutOfBoundsException {@inheritDoc} */ public void add(int index, E element){新しいunsupportedoperationexception(); } /** * {@inheritdoc} * * <p>この実装は、常に * {@code unsupportedoperationexception}をスローします。 * * @throws unsupportedoperationexception {@inheritdoc} * @throws indexoutofboundsexcection {@inheritdoc} */ public e remove(int index){throw new unsupportedoperationexception(); }}Java.util.arraysクラスの内部クラスアレイリストが追加方法をオーバーライドして削除しないため、ADDメソッドを呼び出すと、実際に抽象リストクラスのADDメソッドを呼び出します。
同様に、削除メソッドを呼び出す場合、またはADDおよび削除メソッド(AddAllなど)に関連付けられた他のメソッドを呼び出すと、UnsportedoperationExceptionの例外にも遭遇します。
Addallの例:
/***@author wangmengjun**/public class arrayexample {public static void main(String [] args){/**変数長パラメーターを使用*/list <string> array1 = arrays.Aslist( "welceal"、 "to"、 "java"、 "world"); array1.addall(arrays.aslist( "aaa"、 "bbb")); }}java.util.abstractlist.addのjava.util.abstractlist.addのjava.util.abstractlist.add(java.util.abstractcollection.addall(未知のソース)のjava.util.abstractlist.addのスレッド "main.lang.unsupportedoperationexceptionの例外
セットの例:
/***@author wangmengjun**/public class arrayexample {public static void main(String [] args){/**変数長パラメーターを使用*/list <string> array1 = arrays.Aslist( "welceal"、 "to"、 "java"、 "world"); System.out.println(array1); // javaをhello array1.set(2、 "hello")に置き換えます。 System.out.println(array1); }}これはまさに、Arrayの内部クラスアレイリストが設定された方法を書き換えているため、上記のプログラムは正常に実行され、UnsupportedoperationExceptionの例外をスローしないためです。
結果は次のとおりです。
[ようこそ、to、java、world]
[ようこそ、hello、world]
シナリオを使用します
上記の例と簡単な分析から判断すると、配列ツールクラスはメソッドアスリストを提供し、可変長パラメーターまたは配列をリストに変換できます。
ただし、生成されたリストの長さは固定されています。変更操作を実行できます(特定の位置で要素を変更するなど)。長さに影響する操作を実行できません(追加、削除など)。 UnsupportedoperationExceptionの例外がスローされます。
Arrays.Aslistは、既に配列データまたは一部の要素があるシナリオにより適していますが、読み取り操作にのみ使用されるリストをすばやく作成する必要があり、操作の追加または削除を実行しません。
既知の配列データに基づいて追加、削除、変更、およびチェックできるリストのリストをすばやく取得する場合、比較的単純な方法は次のとおりです。
Java.util.arrayListを再利用して、レイヤーをラップします。
/***@author wangmengjun**/public class arrayexample {public static void main(/**変数長のパラメーターを使用*/list <string> arraylist <>(arrays.aslist( "welcome"、 "to"、 "、" java ")); System.out.println(array1); array1.add( "cool ~~~"); System.out.println(array1); }}結果は次のとおりです。
[ようこそ、to、java、world]
[ようこそ、to、java、world、cool ~~~]
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!