可以将数组用作 HashMap 键吗? [英] Can an array be used as a HashMap key?

查看:46
本文介绍了可以将数组用作 HashMap 键吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果 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 具有您似乎想要的容器对象语义.所以你可以做这样的事情:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆