为什么在Java中实现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) {

我正在试图理解内存泄漏的各种原因,这是我在实现hashCode()和not 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); 
}
}
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)

因此,此代码无条件地将逻辑上不同的条目添加到映射中,因此其大小不受限制地增长