6

こんにちは、みんな。List<String>(またはArrayList)を作成する必要がある語彙アプリを作成しています 。そのために、次のコードを作成しました (ほんの一例です)。

List<String> tempSOLUTION = new ArrayList<String>();
String temp = "abc123";
tempSOLUTION.add(temp);

私も次のことを試しました:

tempSOLUTION.add(new String(temp));

どちらもアイテムをリストに追加しますが、デバッグ中に、その配列には次の12個のオブジェクトがあることがわかりました。

[abc123, null, null, null, null, null, null, null, null, null, null, null]

私の問題は、この新しいリストが のキーであるHashableMap<String>ため、これらの null アイテムを使用できないことです。キーが存在しないため、変更すると例外が発生します。

デバッガーを使用したリスト (tempSOLUTION) の詳細のスクリーンショット: http://www.pabloarteaga.es/stackoverflow.jpg

これらの null アイテムをすべて作成せずに、リストにアイテムを追加するにはどうすればよいですか?

検索した後、これらの null アイテムを削除する方法についての回答が見つかりました。

tempSOLUTION.removeAll(Collections.singleton(null));

しかし、それは私の目的では機能しません。

前もって感謝します。

4

2 に答える 2

14

おそらく、デバッガーで内部配列を見ているでしょう。それは問題ではありません。それは単なる実装の詳細です。

重要なのは、公開 API を通じて何が見えるかです。つまり、何を呼び出しているかsize()(など) が教えてくれます。(そして、コード例でそれが返されない場合は1、何か奇妙なことが起こっています!)

于 2013-08-25T23:46:08.460 に答える
6

あなたのスクリーンショットから、正確に何が何であるかは明らかです

[abc123, null, null, null, null, null, null, null, null, null, null, null]

ArrayListそれ自体ではなく、objectDataたまたまの内部バッファであるメンバー変数ですArrayList(実際に追加した要素を格納する場所)。

ArrayListこのバッファは、新しい要素を追加するたびに、全体をより大きな配列として再割り当てし、すべての要素をコピーする必要があるため、実際のサイズよりも大きなサイズになりますobjectDataが、これは確かにコストがかかります。

Oli のアドバイスに従ってください。実装の詳細は無視して、インターフェースのみを信頼してください。

于 2013-08-25T23:52:13.893 に答える