【问题标题】:HashMap get method throwing error on hm.get(hm) [closed]HashMap get方法在hm.get(hm)上抛出错误[关闭]
【发布时间】:2019-07-08 12:35:49
【问题描述】:

您能解释一下以下场景吗?

HashMap<HashMap,HashMap> hm=new HashMap<>();
hm.put(hm,hm);
hm.get(hm); // ----> On commenting this line, I get no error. 
            //       If I uncomment it, I am getting StackOverflowError

【问题讨论】:

  • 请同时添加错误
  • 你到底想在这里做什么?
  • java.util.HashMap$EntryIterator.(Unknown Source) at java.util.HashMap$EntrySet.iterator(Unknown Source) 处的线程“main”java.lang.StackOverflowError 异常java.util.AbstractMap.hashCode(Unknown Source) at java.util.Objects.hashCode(Unknown Source) at java.util.HashMap$Node.hashCode(Unknown Source)
  • 请将错误和堆栈跟踪(或只是其中的一小部分)粘贴到问题文本中并格式化为代码以提高可读性。不要指望读者跟随链接并将文本视为图像。谢谢。
  • “注意:如果将可变对象用作映射键,则必须非常小心。如果对象的值以影响等于比较的方式更改,而对象是映射中的键,则不指定映射的行为。这种禁止的一个特殊情况是不允许地图包含自己作为键。” from the docs

标签: java hashmap stack-overflow


【解决方案1】:

尝试将HashMap 作为密钥放在自身内部是个坏主意。

hm.put(hm,hm) 之后,您的HashMap 包含一个其hashCode()hm.hashCode() 的键。 hm.hashCode() 是所有Map 条目中hashCode() 的函数。条目的hashCode() 是键和值的hashCode() 的函数(在您的情况下两者都是hm)。因此,为了计算hm.hashCode(),您必须计算hm.hashCode()。这会导致无限递归。

调用hm.get(hm); 需要计算hm.hashCode(),导致无限递归和StackOverflowError

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多