数组可以用作哈希映射键吗?

2022-09-01 04:26:53

如果 的键是一个数组:HashMapString[]

HashMap<String[], String> pathMap;

是否可以使用新创建的数组访问映射,或者它必须是同一对象?String[]String[]

pathMap = new HashMap<>(new String[]{"korey", "docs"}, "/home/korey/docs");
String path = pathMap.get(new String[]{"korey", "docs"});

答案 1

它必须是同一个对象。A 比较键 using 和 Java 中的两个数组只有在它们是同一对象时才相等。HashMapequals()

如果想要值相等,请编写自己的容器类,用于包装 和 并提供适当的语义。在这种情况下,最好使容器不可变,因为更改对象的哈希代码会对基于哈希的容器类造成严重破坏。String[]equals()hashCode()

编辑

正如其他人所指出的,具有您似乎想要的容器对象的语义。所以你可以做这样的事情:List<String>

HashMap<List<String>, String> pathMap;

pathMap.put(
    // unmodifiable so key cannot change hash code
    Collections.unmodifiableList(Arrays.asList("korey", "docs")),
    "/home/korey/docs"
);

// later:
String dir = pathMap.get(Arrays.asList("korey", "docs"));

答案 2

不,但您可以使用它将按预期工作!List<String>