2 java hashmap shallow-copy linkedhashmap
是否可以从中获取值列表HashMap作为参考
class MyCustomObject {
String name;
Integer id;
MyCustomObject(String name, Integer id){
this.name = name;
this.id = id;
}
}
Run Code Online (Sandbox Code Playgroud)
HashMap<Integer, MyCustomObject> map = new LinkedHashMap<>();
map.put (1, new MyCustomObject("abc",1));
map.put (2, new MyCustomObject("xyz",2));
List<MyCustomObject> list = new ArrayList<>(map.values());
Log.i(TAG,"************ List from HashMap ************");
for (MyCustomObject s : list) {
Log.i(TAG,"name = "+s.name);
}
list.set(0,new MyCustomObject("temp",3));
Log.i(TAG,"************ List from HashMap after update ************");
for (MyCustomObject s : list) {
Log.i(TAG,"name = "+s.name);
}
Log.i(TAG,"************ List from HashMap ************");
List<MyCustomObject> list2 = new ArrayList<>(map.values());
for (MyCustomObject s : list2) {
Log.i(TAG,"name = "+s.name);
}
Run Code Online (Sandbox Code Playgroud)
**************** List from HashMap ***************
name = abc
name = xyz
**************** List from HashMap after update ***************
name = temp
name = xyz
**************** List from HashMap ***************
name = abc
name = xyz
Run Code Online (Sandbox Code Playgroud)
在这里,如果从中获取值列表HashMap返回深拷贝。
更新
我的要求
请告诉,如果有任何第三方库提供这样的数据结构,或者处理这种情况的最佳方法是什么
您正在List根据 的值创建一个新的Map:
List<MyCustomObject> list = new ArrayList<>(map.values());
Run Code Online (Sandbox Code Playgroud)
这就是创建 values 副本的原因Collection,并且其中的更改List无法反映在原始Map.
如果map.values()直接修改返回的Collection (例如,map.values().remove(new MyCustomObject("abc",1))),会反映到原来的内容中Map。你不会是能够调用set的Collection,不过,因为Collection没有那个方法。