3 回答
TA贡献1831条经验 获得超9个赞
它必须是同一对象。Java中HashMap使用equals()和的比较键只有在两个对象相同的情况下才相等。
如果你想要的值相等,然后写一个包装了自己的容器类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"));
TA贡献1785条经验 获得超4个赞
它必须是同一对象
有关信息,请参见此示例
public static void main(String[] args) {
HashMap<String[], String> pathMap;
pathMap = new HashMap<String[], String>();
String[] data = new String[] { "korey", "docs" };
pathMap.put(data, "/home/korey/docs");
String path = pathMap.get(data);
System.out.println(path);
}
}
当您在上面运行时,将打印“ docs”。
TA贡献1802条经验 获得超4个赞
在大多数情况下,如果数组内的字符串不是病态的并且不包含逗号和空格,则可以将其Arrays.toString()用作唯一键。即你Map将是一个Map<String, T>。而数组的get / put myKeys[]将是
T t = myMap.get(Arrays.toString(myKeys));
myMap.put(Arrays.toString(myKeys), myT);
显然,如果需要,您可以输入一些包装代码。
一个不错的副作用是您的密钥现在是不变的。当然,您需要更改数组myKeys,然后尝试使用a get(),但是找不到它。
字符串哈希得到高度优化。因此,我的猜测是,这种解决方案尽管感觉有点慢且笨拙,但与使用不可变List的@Ted Hopp解决方案相比,将更快,更高效(更少的对象分配)。只要考虑一下Arrays.toString()您的密钥是否唯一。如果不是,或者有任何疑问(例如String []来自用户输入),请使用列表。
添加回答
举报