この記事では、Javaのリストと配列を変更する方法を分析します。あなたの参照のために全員のためにそれを共有してください。詳細は次のとおりです。
今日、私は奇妙な問題に遭遇するコードを書きました。次のように:
arraylist <string> list = new ArrayList <String>();
この方法でコードを書くことに問題はないはずであり、編集に問題はないと思います。ただし、特定の操作が実行されている場合、レポートは次のように異常です。スレッド「main」java.lang.classcastexception:[ljava.lang.object;
しかし、次のように書くのに問題はありません:
arraylist <string> list = new ArrayList <String>(); list.get(i);}
この現象を説明することができます。Javaは上向きと下向きの変換を可能にしますが、Java仮想マシンのこのオブジェクトのタイプに基づいてこの変換が成功しているかどうか。 Java仮想マシンは、各オブジェクトのタイプを保存します。配列もオブジェクトです。配列のタイプ[ljava.lang.object。 [ljava.lang.objectを[ljava.lang.stringに変換することは明らかに不可能であり、仮想マシンはこれがオブジェクトアレイであることを保証するだけです。アレイは要素が配列の要素であるため、この変換は成功することはできません。配列内の要素は、ストレージの特定の要素ではなく、要素の参照のみであるため、配列の要素のタイプはJava仮想マシンにまだ保存されます。
上記の説明によると、この問題を次のモデルに要約できます。
オブジェクトobjs [] = new Object [10];
これは上記のコンピレーションと同じです。次のように、このコードを変更する場合:
string strs [] = new String [10];
これをコンパイルして渡すことができます。したがって、この問題をJava変換ルールの問題に帰することができます。モデル上のJavaアレイのサポートについて話しましょう。
JDK5はすでにモデルタイプをサポートしているため、コレクションとマップのデータ型のセキュリティを確保できます。個人的には、モデルに従って対応するt []を返す必要があります。 JDKのソースコードを詳しく見て、そのリストにはアレイに変換する2つの方法があります。
public Object [] toarray();
このメソッドは、リスト内のすべての要素を同じサイズの配列に返し、配列内のすべての要素はオブジェクトタイプです。
public <t> t [] toarray(t [] a);
このメソッドは、リスト内のすべての要素を同じサイズの配列に返し、配列内のすべての要素がtタイプです。
Listは、Javaコンパイラが新しいモデル配列を持つことができないために設計されています。つまり、このような配列を定義することはできません。
t arr = new t [size];
ただし、T []を使用して配列を表すことができ、配列をt []に変換できます。たとえば、リストのpublic <t> t [] toarray(t [] a)が実現します。
public <t> t [] toarray(t [] a){if(a.length <size)a =(t [])java.lang.reflect.array.newinstance(a.getclass()。getComponentType()、 getComponentType()、System.ArrayCopy(0、a、0、size);
上記のコードから、この配列のタイプがわからないため、反射メカニズム(a.getClass()。getComponentType()メソッドを介してこの配列を作成する必要があることがわかります。
最終的に、リストはアレイに変換してそれを処理します::
arraylist <string> list = new ArrayList <String>()strings = new string [list.size()];
逆に、配列をリストに変えたい場合はどうなりますか?次のように:
string [] s = {"a"、 "b"、 "c"};
この記事がすべての人のJavaプログラムのデザインに役立つことが期待されています。