我试图理解内存泄漏的各种原因我发现其中一个示例实现了hashCode()而不是equals()。我已经读完了那个,如果一个人过度骑行,另一个也因为合同违规而被过度骑行。
这是示例代码
import java.util.HashMap;
import java.util.Map;
public class MemoryLeak {
static class Key {
Integer id;
Key(Integer id) {
this.id = id;
}
@Override
public int hashCode() {
return id.hashCode();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Map m = new HashMap();
while (true)
for (int i = 0; i < 10000; i++)
if (!m.containsKey(i))
m.put(new Key(i), "Number:" + i);
}
}
我知道我没有故意实现equals()方法。但我想知道为什么会在内部发生内存泄漏。
感谢
答案 0 :(得分:11)
如果您未实施Key#equals()
,则两个Key
实例不会相等,因此Map#containsKey()
将始终返回false
。此外,您正在检查containsKey(i)
,但未使用i
作为密钥。即使您实施了Key#equals()
,containsKey
检查也是有效if(true)
。
因此,此代码无条件地向地图添加逻辑上不同的条目,因此其大小不受限制地增长。