2016-06-15 3 views
4
class MyObject { 
    int field; 
    public void setField(int arg1) { 
     this.field = arg1; 
    } 
} 

HashMap<String, MyObject> map; 
... 
... // put some MyObjects in the map with strings as keys 
... 
for (MyObject object : map.values()) { 
    object.setField(12345); 
} 

サイクル内のオブジェクトに対する変更は、マップ内の同じオブジェクトで行われますか?Java:HashMapクラスのこのメソッドの意味は?

ガイドでは、このマップに含まれる値のコレクションビューを返します

values()方法

についてはこれを言います。コレクションはマップによってサポートされているため、マップの変更はコレクションに反映され、その逆もあります。

"マップの変更"は "マップされたオブジェクトの変更"を意味しますか?だからこの方法でsetFieldメソッドはマップ内のオブジェクトを変更できますか?

+0

これは正しいです。それを試してみてください。 – hexafraction

+0

はい、地図に実際のオブジェクトへのポインタが含まれているのを見ると、 'values()'メソッドを使うときに同じポインタが得られ、メモリ内の全く同じオブジェクトを操作します。 – ToVine

+0

いいえ。つまり、マッピングを変更した場合、つまり、追加、削除、変更したキーと値のペアは、返されたコレクションに表示されます。 –

答えて

6

"マップの変更"は "マップされたオブジェクトの変更"を意味しますか?

それはマップへの変更を意味する(ただし、以下も参照します)。コレクションはライブビューのマップの値です。そのため、マップにエントリを追加したり、マップからエントリを削除したりすると、コレクションにはその変更が反映されます。 2つはリンクされています。例えば:

Map<String, String> m = new HashMap<String, String>(); 
Collection<String> c = m.values(); 
m.put("hi, "there"); 
System.out.println(c.size()); // 1, not 0 

Live Example

別に

:当然にかかわらず、あなたがを介してそれらのオブジェクトへの参照を取得するかどうかの表示されるマップの値として格納されているオブジェクトの状態に変化コレクションまたは地図;彼らはオブジェクトの参照であり、オブジェクトののコピーではありません。

+0

ありがとうございました。今はすべてがクリアです。 – user3290180

-1

含まれている地図のための例:あなたがオブジェクトに変異メソッドを使用する場合、「VALUE1」、「値2」

とはい:

"key1" -> "value1" 
"key2" -> "value2" 

values()はのコレクションを返します。マップは以前に取得したvalues()コレクションで変更されます。 しかし、最も興味深いのは、マップから要素を追加/削除すると、値のコレクションがに変更されるということです。

例:

Map<String, String> map = new HashMap<>(); 
Collection<String> vals = map.values(); 
System.out.println("Before: " + vals); 
map.put("key1", "value1"); 
System.out.println("After: " + vals); 

これが印刷されます:

Before: [] 
After: [value1] 
0

値メソッドは、メモリ内にオブジェクトへの参照のセットを返します。オブジェクトは変更可能であるため、マップには同じメモリへの参照があるため、それらに加えられた変更はマップに反映されます。

1

メソッドHashMap.values() - javadocで説明されているとおりです。

このマップに含まれる値のコレクションビューを返します。コレクションはマップによってサポートされているため、マップの変更はコレクションに反映され、その逆もあります。コレクション上の反復処理中にマップが変更された場合(反復子自身の削除操作を除いて)、反復の結果は未定義です。このコレクションは、Iterator.remove、Collection.remove、removeAll、retainAll、およびclear操作を使用して、対応するマッピングをマップから削除する要素の削除をサポートしています。 addまたはaddAll操作はサポートされていません。

これは、配列内のすべての要素のコレクション(Listに似ています)を返します。また、コレクションはマップによってバックアップされているので、マップを変更するとコレクションも更新され、コレクションを変更するとマップも変更されます。このコレクションから要素を追加することは不可能です。

この例は、このメソッドの使用法を非常によく示しています。

public static void main(String[] args) { 
    Map<String, String> mapValues = new HashMap<>(); 
    mapValues.put("Hi", "Hello"); 
    mapValues.put("Bye", "Goodbye"); 
    System.out.println(mapValues.size());//prints 2 
    Collection<String> values = mapValues.values(); 
    values.remove("Hello"); 
    System.out.println(mapValues.size());//prints 1 
    System.out.println(values.size());//prints 1 
    mapValues.put("Morning", "Good morning"); 
    System.out.println(mapValues.size());//prints 2 
    System.out.println(values.size());//prints 2 
} 
関連する問題