link 如何在 HashMap 中将多个键指向相同的值

How link multiple keys to the same value in the HashMap

我正在尝试 link 将一个键的值转换为另一个键的值,但似乎无法正常工作。

例如,如果我正在创建 HashMap 并向其添加键值对 ("x", 0)。然后我希望能够添加 other keys 映射到与第一个相同的值。

因此,如果我有 ("x", map.get("y"))("y", 0),我希望能够以某种方式 link 它。因此,如果我现在像 ("y", 10) 那样更新 "y" 键的值,那么我希望 map.get("x") 也应该 return 10.

HashMap<String, Integer> map = new HashMap<>();
map.put("x", 0);
map.put("y", 0);

//I now somehow want to link the value of x so its dependent on y

System.out.println(map.get("x"));
//Should return 0

map.put("y", 10);

System.out.println(map.get("x"));
//Should return 10 now

我不知道如何让它工作,因为 x 总是得到 y 现在的值,而不是打印值时 y 的值。

如果要将一组关联到同一个对象,可以使用可变对象作为一个值。

例如,您可以使用 StringBuilder 或实现自定义 class。与实现扩展 HashMap 并能够跟踪这些组的自己的地图的方法相比,它 更高效 并且 更容易 键并为每次调用 put()replace()remove().

触发一系列更新

具有自定义可变 Container 的解决方案可能如下所示:

HashMap<String, Container<Integer>> map = new HashMap<>();
Container<Integer> commonValue = new Container<>(0);
map.put("x", commonValue);
map.put("y", commonValue);

System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));

commonValue.setValue(10);

System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));

Container class 本身。

public class Container<T> {
    private T value;

    public Container(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return String.valueOf(value);
    }
}

正如我已经说过的,另一种方法是使用 JDK 已经提供的可变 class。然后代码就差不多了:

HashMap<String, StringBuilder> map = new HashMap<>();
StringBuilder commonValue = new StringBuilder("0");
map.put("x", commonValue);
map.put("y", commonValue);

System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));

commonValue.replace(0, commonValue.length(), "10");

System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));

输出(两个版本)

Value for 'x': 0
Value for 'y': 0
Value for 'x': 10
Value for 'y': 10