数组可以用作 HashMap 键吗? [英] Can an array be used as a HashMap key?
问题描述
如果 HashMap
的键是 String[]
数组:
If a HashMap
's key is a String[]
array:
HashMap<String[], String> pathMap;
您可以使用新创建的 String[]
数组访问地图,还是必须是相同的 String[]
对象?
Can you access the map by using a newly created String[]
array, or does it have to be the same String[]
object?
pathMap = new HashMap<>(new String[]{"korey", "docs"}, "/home/korey/docs");
String path = pathMap.get(new String[]{"korey", "docs"});
推荐答案
它必须是同一个对象.HashMap
使用 equals()
比较键,Java 中的两个数组只有当它们是同一个对象时才相等.
It will have to be the same object. A HashMap
compares keys using equals()
and two arrays in Java are equal only if they are the same object.
如果你想要值相等,那么编写你自己的容器类来包装一个 String[]
并为 equals()
和 hashCode()代码>.在这种情况下,最好使容器不可变,因为更改对象的哈希码会对基于哈希的容器类造成严重破坏.
If you want value equality, then write your own container class that wraps a String[]
and provides the appropriate semantics for equals()
and hashCode()
. In this case, it would be best to make the container immutable, as changing the hash code for an object plays havoc with the hash-based container classes.
编辑
正如其他人指出的那样,List<String>
具有您似乎想要的容器对象的语义.所以你可以这样做:
As others have pointed out, List<String>
has the semantics you seem to want for a container object. So you could do something like this:
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"));
这篇关于数组可以用作 HashMap 键吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!