为了账号安全,请及时绑定邮箱和手机立即绑定

Java数组可以用作HashMap键吗

Java数组可以用作HashMap键吗

哈士奇WWW 2019-12-14 15:11:55
如果HashMap的键是字符串数组:HashMap<String[], String> pathMap;您可以使用新创建的字符串数组访问地图,还是必须是相同的String []对象?pathMap = new HashMap<>(new String[] { "korey", "docs" }, "/home/korey/docs");String path = pathMap.get(new String[] { "korey", "docs" });
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

它必须是同一对象。Java中HashMap使用equals()和的比较键只有在两个对象相同的情况下才相等。


如果你想要的值相等,然后写一个包装了自己的容器类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"));



查看完整回答
反对 回复 2019-12-16
?
千万里不及你

TA贡献1784条经验 获得超9个赞

它必须是同一对象


有关信息,请参见此示例


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

    }

}

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



查看完整回答
反对 回复 2019-12-16
?
千巷猫影

TA贡献1829条经验 获得超7个赞

在大多数情况下,如果数组内的字符串不是病态的并且不包含逗号和空格,则可以将其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 []来自用户输入),请使用列表。



查看完整回答
反对 回复 2019-12-16
  • 3 回答
  • 0 关注
  • 319 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信