为什么在Java中实现equals方法不会导致内存泄漏
我正在试图理解内存泄漏的各种原因,这是我在实现hashCode()和not equals()时看到的一个示例。我已经通读了这篇文章,如果其中一篇文章被过度使用,那么另一篇文章也必须被过度使用,因为违反了合同 这是示例代码为什么在Java中实现equals方法不会导致内存泄漏,java,memory-leaks,Java,Memory Leaks,我正在试图理解内存泄漏的各种原因,这是我在实现hashCode()和not equals()时看到的一个示例。我已经通读了这篇文章,如果其中一篇文章被过度使用,那么另一篇文章也必须被过度使用,因为违反了合同 这是示例代码 import java.util.HashMap; import java.util.Map; public class MemoryLeak { static class Key { Integer id; Key(Integer id) {
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);
}
}
import java.util.HashMap;
导入java.util.Map;
公共类记忆库{
静态类键{
整数id;
键(整数id){
this.id=id;
}
@凌驾
public int hashCode(){
返回id.hashCode();
}
}
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
Map m=新的HashMap();
while(true)
对于(int i=0;i<10000;i++)
如果(!m.containsKey(i))
m、 put(新键(i),“编号:+i”);
}
}
我知道我不是故意实现equals()方法的。但我想弄清楚为什么内存泄漏是由内部发生的事情造成的
谢谢如果不实现
Key#equals()
,没有两个Key
实例是相等的,因此Map#containsKey()
将始终返回false
。此外,您正在检查containsKey(i)
,但没有使用i
作为键。即使您确实实现了key#equals()
,containsKey
检查有效地if(true)
因此,此代码无条件地将逻辑上不同的条目添加到映射中,因此其大小不受限制地增长