可以将java数组用作HashMap键

Kor*_*ton 25 java arrays hashmap

如果HashMap的键是一个字符串数组:

HashMap<String[], String> pathMap;
Run Code Online (Sandbox Code Playgroud)

您可以使用新创建的字符串数组访问地图,还是必须是相同的String []对象?

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

Ted*_*opp 39

它必须是同一个对象.甲HashMap比较了使用键equals()和在Java中两个数组仅当它们是相同的对象相等.

如果你想要的值相等,然后写一个包装了自己的容器类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"));
Run Code Online (Sandbox Code Playgroud)

  • 我认为它还使用`hashCode()`来确定对象的哈希值. (2认同)
  • @KoreyHinton - 不客气。:) 不过,在此之前,请检查 `List` 是否满足您的需求。请参阅我编辑的答案。 (2认同)

Tom*_*rae 6

不,但你可以使用List<String>哪个将按预期工作!

  • 这有一点需要注意.如果您要使用`List <String>`作为基于散列的集合中的键,则该列表应该是不可修改的.如果对象的哈希码在对象被用作基于哈希的集合中的键时发生更改,则该集合通常会中断. (8认同)
  • @SteveKuo - 是的.`List`的文档要求任何实现都使用`equals()`和`hashCode()`的特定语义.所需的语义与OP似乎想要的匹配. (3认同)

Eng*_*uad 5

Java 中的数组使用Object'shashCode()且不覆盖它(与equals()and相同toString())。所以不,你不能不使用数组作为哈希映射键。

  • 你_可以_使用它们作为密钥,它只会使用对象对其 hashCode 所做的任何事情...不是他想要的,但没有什么可以阻止你这样做。 (2认同)