从 HashMap 获取值作为参考

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返回深拷贝。

更新

我的要求

  1. 我想要来自 HashMap 的值列表,因为我想使用它们的位置访问项目
  2. 我想保留值的顺序
  3. 如果我修改了提取列表中的任何内容,那么它也应该反映在 HashMap 中

请告诉,如果有任何第三方库提供这样的数据结构,或者处理这种情况的最佳方法是什么

Era*_*ran 5

您正在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。你不会是能够调用setCollection,不过,因为Collection没有那个方法。