代码之家  ›  专栏  ›  技术社区  ›  sagar

我们可以在其他映射中使用嵌套映射作为键吗?

  •  3
  • sagar  · 技术社区  · 10 年前

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

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

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

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

    4 回复  |  直到 10 年前
        1
  •  9
  •   Tim B    10 年前

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

    映射的键需要是常量,并且需要设置其equals和hashcode以给出正确的行为。如果在将关键点添加到地图中后对其进行修改,则会使地图无效。

    HashMap可以修改,因此不应用作键。

    要解释为什么更改它是一个问题,您需要了解哈希图是如何工作的。这非常简单,但假设您有 HashMap H 包含两个桶。让我们称它们为B0和B1。

    每当您添加 Object HashMap 它看着那些物体 hashCode 如果最后的位是0,则它进入B0,如果它是1,则它进B1。

    现在,当查找对象时,它会查看 哈希代码 然后立即转到正确的存储桶,然后只需搜索该存储桶中的对象即可找到所需的对象。

    通过使用多于2个的存储桶,可以将每个存储桶中的项目数量减少2、4、8或更多倍,从而减少需要检查的对象数量。

    然而,假设您在地图中放置一个对象,它将被添加到B0。然后更改对象,hashCode将更改,因此最后一位现在为1。

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

    这就是为什么hashCode对于HashMap中用作键的任何对象都必须是常量,否则您可能会“丢失”这些键。

        2
  •  1
  •   Shriram    10 年前
    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();
    

    使用迭代器迭代hashmap值的值 根据您的需求实现这种功能,否则不建议使用。

        3
  •  0
  •   Le Ish Man    10 年前

    不能将Map用作键,但可以将其用作值。

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

        4
  •  0
  •   asherbret    4 年前

    如其他回答中所述, HashMap 不应该用作映射键,因为它是可变的,但是,它是不可变的映射,如Guava的 ImmutableMap 将起作用。