有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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"});

共 (6) 个答案

  1. # 1 楼答案

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

    如果希望值相等,那么编写自己的容器类来包装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"));
    
  2. # 2 楼答案

    泰德·霍普是对的,它必须是同一个物体

    有关信息,请参见以下示例:

    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);
    }
    

    当您运行上述代码时,它将打印“文档”

  3. # 3 楼答案

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

    但是您可以编写一个包含对数组的引用的包装器类,该类还覆盖hashCode()equals()

  4. # 4 楼答案

    不,但是你可以使用List<String>,它会像你期望的那样工作

  5. # 5 楼答案

    Java中的数组使用ObjecthashCode(),并且不重写它(与equals()toString()的情况相同)。因此,不能使用数组作为hashmap键

  6. # 6 楼答案

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

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

    显然,如果需要的话,可以添加一些包装代码

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

    字符串哈希是高度优化的。因此,我的猜测是,这个解决方案虽然感觉有点慢和笨拙,但与使用不可变列表的@Ted Hopp解决方案相比,它速度更快,内存效率更高(对象分配更少)。想想Arrays.toString()对你的密钥来说是否是唯一的。如果没有,或者有任何疑问(例如字符串[]来自用户输入),请使用列表