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:
这种禁令的一个特例是地图不允许将自己作为关键词包含在内.
问题是你使用的不是标准对象(任何具有良好定义equals和hashCode方法的对象,而不是地图本身),而是地图本身.
问题是如何hashCode的HashMap计算方法是:
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.因为地图的唯一元素是地图本身,所以它成为递归的来源.
与可以用作密钥(具有良好定义另一个对象替换地图equals和hashCode)将工作:
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)
| 归档时间: |
|
| 查看次数: |
800 次 |
| 最近记录: |