我们可以将嵌套地图作为其他地图中的关键字吗?

时间:2014-09-11 07:54:47

标签: java collections map hashmap treemap

我刚刚开始在Java中实现数据结构,并且想知道我们是否会遇到这样的情况。

Map<HashMap<String,String>,String> map = new HashMap<HashMap<String,String>,String>(); 

如果是的话,请举一个小例子。

如果您未发现相关问题,请在评论中提及

4 个答案:

答案 0 :(得分:5)

可以这样做,但在大多数情况下你不应该这样做。

映射的关键点必须是常量,并且需要设置其equals和hashcode以提供正确的行为。如果在将密钥添加到地图后修改密钥,则会使地图无效。

可以修改HashMap,因此不应将其用作密钥。

要解释为什么更改它是一个问题,您需要知道hashmaps的工作原理。这是非常简化的,但是假设您有一个HashMap H包含两个存储桶。让我们称它们为B0和B1。

每当您向Object添加HashMap时,它都会查看对象hashCode。如果最后一位为0则进入B0,如果为1,则进入B1。

现在,在查找对象时,它会查看hashCode并立即转到右侧存储桶,然后只需搜索该存储桶中的对象即可找到所需的对象。

通过使用更多的桶而不仅仅是2,您可以将每个桶中的项目数减少2,4,8或更多次,从而减少需要检查的对象数量。

但是,假设您将一个对象放在地图中并将其添加到B0中。然后更改对象并更改hashCode,使最后一位为1。

如果你执行map.contains(obj),你会得到错误的结果,因为它会查看hashCode,直接跳转到B1并只扫描该对象。但是对象被放置在B0中,因为这是hashCode插入时的内容。

这就是为什么hashCode对于任何被用作HashMap中的键的对象必须是常量的,否则你可能会失去&#34;这些钥匙。

答案 1 :(得分:1)

HashMap<String, String> map = new HashMap<String, String>();
        HashMap<HashMap<String, String>, String> tMap = new HashMap<HashMap<String, String>, String>();
        map.put("1", "one");
        map.put("2", "two");
        tMap.put(map, "numbers");
        //for getting the value
        Set description = tMap.entrySet();

使用Iterator迭代hashmap值的值 根据您的需要实现此类功能,否则不建议使用。

答案 2 :(得分:0)

您不能将地图用作关键字,但可以将其用作值。

为了进一步解释,由于您可能会添加到HashMap,因此密钥将不会保持不变,因此将不再用作密钥的目的。

答案 3 :(得分:0)

如其他答案中所述,HashMap不应用作地图键,因为它是可变的,但是像Guava的ImmutableMap这样的不可变地图也可以使用。