可以将java数组用作HashMap键

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

HashMap pathMap; 

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

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

它必须是同一个对象。 HashMap使用equals()比较键,并且Java中的两个数组只有在它们是同一个对象时才相等。

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

编辑

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

 HashMap, 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")); 

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

Ted Hopp是对的,它必须是同一个对象

有关信息,请参阅此示例

 public static void main(String[] args) { HashMap pathMap; pathMap = new HashMap(); String[] data = new String[] { "korey", "docs" }; pathMap.put(data, "/home/korey/docs"); String path = pathMap.get(data); System.out.println(path); } } 

当您在上面运行时,它将打印“docs”。

您不能将普通Java Array用作HashMap的键。 (嗯,你可以,但它不会按预期工作。)

但是你可以编写一个包含类的引用类,它也会覆盖hashCode()equals()

Java中的数组使用ObjecthashCode()并且不覆盖它(与equals()toString() )。 所以不,你不能不使用数组作为hashmap键。

在大多数情况下,如果数组中的字符串不是病态的,并且不包含逗号后跟空格,则可以使用Arrays.toString()作为唯一键。 即你的Map将是Map 。 并且数组myKeys[]的get / put将是

 T t = myMap.get(Arrays.toString(myKeys)); myMap.put(Arrays.toString(myKeys), myT); 

显然,如果需要,你可以输入一些包装代码。

一个很好的副作用是你的密钥现在是不可变的。 当然,你改变你的数组myKeys然后尝试get() ,你将找不到它。

Hashing of Strings经过高度优化。 所以我的猜测是,这个解决方案,虽然感觉有点慢和kludgy,将比使用不可变List的@Ted Hopp解决方案更快和更高的内存效率(更少的对象分配)。 试想一下Arrays.toString()对于你的键是否是唯一的。 如果没有,或者有任何疑问,(例如String []来自用户输入)使用List。