2

私は次のLinkHashMapを持っています、

LinkedHashMap<String, ArrayList<String>> test1=new ...

ループで、次のようにキーと値のペアを割り当てます。

ArrayList<String> temp=new ...
//start iteration
temp.add("some strings")
test1.put("some string", temp);
temp.clear()//temp is cleared for next iteration

ここでtempは、直前に作成して何かを追加する一時的なリストです。しかし、問題は、 temp をクリアすると、 test1 に渡されたtempクリアれることです。つまり、参照によってコピーされます。test1 内で参照を維持しながら temp を使用するにはどうすればよいですか。それが基本的な概念であることは知っていますが、私はJavaが初めてで、そのすべての機能を理解していませんでした.

4

4 に答える 4

6

Listこれは、実際には、をコピーしていないためですtemp。ポインタ(Java用語では「参照」)をコピーしています。

ここには2つの簡単な解決策があります。

  1. マップに保存するものとして、 Listusingの実際のコピーを作成します。new ArrayList<String>(temp)
  2. を行う代わりに、をtemp.clear()行いますtemp = new ArrayList<String>()

2番目のオプションは、何もコピーを作成しないため、最高のパフォーマンスを発揮します。参照を新しいものに置き換えるだけArrayListです。

于 2012-09-07T02:58:28.420 に答える
1

LinkedHashMap.put()メソッドはオブジェクトの参照を追加するためList<T>(つまり、単一のオブジェクトが参照によって参照されLinkedHashMap、オブジェクト参照(変数または)を介してそのオブジェクトをArrayList<String>操作できるようになります)、メソッドを呼び出さずに別のオブジェクトを作成します。temptest1.get("some strings")clear()List<T>

ArrayList<String> temp=new ArrayList<String>();
temp.add("some strings")
test1.put("some string", temp);

temp=new ArrayList<String>();
temp.add("foo");
test2.put("another string",temp);
于 2012-09-07T02:57:47.903 に答える
1

誰か(呼び出し元または呼び出し先)は、によってアドレス指定されたArrayListのコピーtempを作成する必要があります。または、の新しいArrayListを作成する必要がありますtemp。2番目のアプローチは、Javaの「スタイル」に沿ったものです(呼び出し先はユーザーの制御下にないため、おそらく唯一のオプションです)。

于 2012-09-07T02:57:56.000 に答える
1

次の反復のためにクリアするのではなく、新しい参照を作成するだけです。リストからすべての要素を削除すると、反復中にパフォーマンスの問題になる可能性があります。

于 2012-09-07T02:59:02.267 に答える