在HashMap中多次使用键时无限循环

Jok*_*ker 5 java stack-overflow hash hashmap

HashMap 陷入无限循环.

我无法理解为什么HashMap在多次使用相同的密钥时抛出stackoverflow错误.

码:

import java.util.HashMap;

public class Test {
    public static void main(String[] args) {
        HashMap hm = new HashMap();

        hm.put(hm, "1");
        hm.put(hm, "2");
    }
} 
Run Code Online (Sandbox Code Playgroud)

错误:

线程"main"java.lang.StackOverflowError中的异常

Dav*_*INO 11

无法将Map自身添加为关键字.来自javadoc:

这种禁令的一个特例是地图不允许将自己作为关键词包含在内.


问题是你使用的不是标准对象(任何具有良好定义equalshashCode方法的对象,而不是地图本身),而是地图本身.

问题是如何hashCodeHashMap计算方法是:

public int hashCode() {
   int h = 0;
   Iterator<Entry<K,V>> i = entrySet().iterator();
   while (i.hasNext())
       h += i.next().hashCode();
   return h;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,要计算地图的hashCode,它会迭代地图的所有元素.对于每个元素,它计算hashCode.因为地图的唯一元素是地图本身,所以它成为递归的来源.

与可以用作密钥(具有良好定义另一个对象替换地图equalshashCode)将工作:

import java.util.HashMap;

 public class Test {
   public static void main(String[] args) {
     HashMap hm = new HashMap();

     String key = "k1";
     hm.put(key, "1");
     hm.put(key, "2");
   }
} 
Run Code Online (Sandbox Code Playgroud)