次のようなJavaでリンクリストの配列を定義しようとしましたが、コンパイルは正常に完了しましたが、2つの警告メッセージが生成されました。
LinkedList<Long> [] hashtable = new LinkedList[10];
warning: [rawtypes] found raw type: LinkedList
LinkedList<Long> [] hashtable = new LinkedList[10];
^
missing type arguments for generic class LinkedList<E>
where E is a type-variable:
E extends Object declared in class LinkedList
HashTable.java:13: warning: [unchecked] unchecked conversion
LinkedList<Long> [] hashtable = new LinkedList[10];
^
required: LinkedList<Long>[]
found: LinkedList[]
だから、私は試しました
LinkedList<Long> [] hashtable = new LinkedList<Long>[10];
しかし、今回は、代わりにこのエラーをコンパイルして生成することさえしません。
HashTable.java:13: error: generic array creation
LinkedList<Long> [] hashtable = new LinkedList<Long>[10];
^
1 error
それで、リンクされたリストの配列を適切に定義するにはどうすればよいですか?
回答:
回答№1は6これは配列を作成する適切な方法です。
@SuppressWarnings("unchecked") LinkedList<Long> [] hashtable = new LinkedList[10];
パラメーター化された型の配列を作成できません
パラメーター化された型の配列を作成することはできません。たとえば、次のコードはコンパイルされません。
List<Integer>[] arrayOfLists = new List<Integer>[2]; // compile-time error
次のコードは、さまざまな型が配列に挿入されたときに何が起こるかを示しています。
Object[] strings = new String[2];
strings[0] = "hi"; // OK
strings[1] = 100; // An ArrayStoreException is thrown.
一般的なリストで同じことをしようとすると、問題が発生します。
Object[] stringLists = new List<String>[]; // compiler error, but pretend it"s allowed
stringLists[0] = new ArrayList<String>(); // OK
stringLists[1] = new ArrayList<Integer>(); // An ArrayStoreException should be thrown,
// but the runtime can"t detect it.
パラメータ化されたリストの配列が許可されている場合、以前のコードは目的のスローに失敗します ArrayStoreException
.
取られた docs.oracle.com
だから私はhashtable []に何を保存できますか?
それは私が今文字列のリンクされたリストを持つことが許可されていることを意味します ハッシュテーブル[0]およびハッシュテーブルのLongのリンクリスト1、 私が行った場合 LinkedList [] hashtable = new LinkedList [10]?
いいえ、コンパイラーはLinkedListをハッシュテーブル配列に直接格納することを許可しません。次のスニペットはコンパイルしません:
hashtable[0] = new LinkedList<String>();
ただし、型パラメーターなしでLinkedListを保存することも、LinkedListのサブクラスを保存することもできます。
@SuppressWarnings("unchecked") LinkedList<Long>[] hashtable = new LinkedList[10];
hashtable[0] = new LinkedList<Long>();
hashtable[1] = new MyLinkedList<Long>();
hashtable[2] = new LinkedList();
hashtable[3] = new MyLinkedList();
配列をLinkedList []にキャストすると、LinkedListを保存できます。ただし、「LinkedList以外は保存できません」:
LinkedList[] rawHashTable = hashtable;
rawHashTable[4] = new LinkedList<String>();
Object[] objectHashTable = rawHashTable;
objectHashTable[5] = "This line will throw an ArrayStoreException ";
回答№2のための5
まず、各要素がLinkedListである配列サイズを定義します。
LinkedList<Long> hashTable[] = new LinkedList[10];
配列内の各要素は LinkedList
それ自体とすべてが null
それぞれを初期化する必要があります。したがって、
for (int i=0;i<10;i++)
hashTable[i] = new LinkedList<Long>();
リストにデータを追加する場合は、次のようにします。
hashTable[i].add(YOUR_LONG_DATA_HERE);
そして最後に繰り返します、
for (int i=0;i<10;i++){
for (Long j: hashTable[i])
System.out.println(j);
}
回答№3の場合は0
LinkedListのリスト/配列が必要な場合は、ArrayListを使用して、初期サイズが10のコレクションを保持できます。
ここにあなたが試すことができる代替アプローチがあります:
ArrayList<LinkedList<Long>> list = new ArrayList<LinkedList<Long>>(10);