Java数组可以用作HashMap键吗

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


HashMap<String[], String> pathMap;

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


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

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


哈士奇WWW
浏览 321回答 3
3回答

LEATH

它必须是同一对象。Java中HashMap使用equals()和的比较键只有在两个对象相同的情况下才相等。如果你想要的值相等,然后写一个包装了自己的容器类String[],并提供了相应的语义equals()和hashCode()。在这种情况下,最好使容器不可变,因为更改对象的哈希码会对基于哈希的容器类造成破坏。编辑正如其他人指出的那样,List<String>具有您似乎想要的容器对象的语义。因此,您可以执行以下操作:HashMap<List<String>, String> pathMap;pathMap.put(&nbsp; &nbsp; // unmodifiable so key cannot change hash code&nbsp; &nbsp; Collections.unmodifiableList(Arrays.asList("korey", "docs")),&nbsp; &nbsp; "/home/korey/docs");// later:String dir = pathMap.get(Arrays.asList("korey", "docs"));

千万里不及你

它必须是同一对象有关信息,请参见此示例public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; HashMap<String[], String> pathMap;&nbsp; &nbsp; &nbsp; &nbsp; pathMap = new HashMap<String[], String>();&nbsp; &nbsp; &nbsp; &nbsp; String[] data = new String[] { "korey", "docs" };&nbsp; &nbsp; &nbsp; &nbsp; pathMap.put(data, "/home/korey/docs");&nbsp; &nbsp; &nbsp; &nbsp; String path = pathMap.get(data);&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(path);&nbsp; &nbsp; }}当您在上面运行时,将打印“ docs”。

千巷猫影

在大多数情况下,如果数组内的字符串不是病态的并且不包含逗号和空格,则可以将其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 []来自用户输入),请使用列表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java