java可以将数组用作HashMap键吗?
如果HashMap
的键是String[]
数组:
HashMap<String[], String> pathMap;
您可以使用新创建的String[]
数组访问映射,还是必须是相同的String[]
对象
pathMap = new HashMap<>(new String[]{"korey", "docs"}, "/home/korey/docs");
String path = pathMap.get(new String[]{"korey", "docs"});
# 1 楼答案
它必须是同一个物体。一个
HashMap
使用equals()
比较键,Java中的两个数组只有在它们是同一个对象时才相等如果希望值相等,那么编写自己的容器类来包装
String[]
,并为equals()
和hashCode()
提供适当的语义。在这种情况下,最好使容器不可变,因为更改对象的哈希代码会破坏基于哈希的容器类编辑
正如其他人所指出的,
List<String>
具有您似乎想要的容器对象的语义。所以你可以这样做:# 2 楼答案
泰德·霍普是对的,它必须是同一个物体
有关信息,请参见以下示例:
当您运行上述代码时,它将打印“文档”
# 3 楼答案
不能将普通Java
Array
用作HashMap
中的键。(嗯,你可以,但它不会像预期的那样工作。)但是您可以编写一个包含对数组的引用的包装器类,该类还覆盖
hashCode()
和equals()
# 4 楼答案
不,但是你可以使用
List<String>
,它会像你期望的那样工作# 5 楼答案
Java中的数组使用
Object
的hashCode()
,并且不重写它(与equals()
和toString()
的情况相同)。因此,不能使用数组作为hashmap键# 6 楼答案
在大多数情况下,如果数组中的字符串不是病态的,并且不包含后跟空格的逗号,则可以使用
Arrays.toString()
作为唯一键。i、 e.你的Map
将是一个Map<String, T>
。数组myKeys[]
的get/put是显然,如果需要的话,可以添加一些包装代码
一个很好的副作用是,您的密钥现在是不可变的。当然,如果您更改数组myKeys,然后尝试
get()
,您将找不到它字符串哈希是高度优化的。因此,我的猜测是,这个解决方案虽然感觉有点慢和笨拙,但与使用不可变列表的@Ted Hopp解决方案相比,它速度更快,内存效率更高(对象分配更少)。想想
Arrays.toString()
对你的密钥来说是否是唯一的。如果没有,或者有任何疑问(例如字符串[]来自用户输入),请使用列表