HashMap get方法在hm.get(hm)上抛出错误[关闭]

Posted

技术标签:

【中文标题】HashMap get方法在hm.get(hm)上抛出错误[关闭]【英文标题】:HashMap get method throwing error on hm.get(hm) [closed] 【发布时间】: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 ***Error

【问题讨论】:

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

【讨论】:

以上是关于HashMap get方法在hm.get(hm)上抛出错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在jsp页面怎样通过jstl标签调用java类中的方法?大虾们来救哈急哟。。。。

Map集合

Map集合

Java HashMap 如何为“get”操作执行恒定时间查找 O(1)?

在Java中迭代HashMap

高手解答:HashMap 取最后加进来的10条