2013-10-09 26 views
6

我想了解内存泄漏的其中一个示例,我在其中实现了hashCode()的示例,而不是equals()。我已经通读了那篇文章,如果一个人因为违反合同而战胜了另一个人也必须被过度缠身。为什么不在Java中实现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()上目的方法。但我想站在内部为什么内存泄漏被创建。

感谢

回答

11

如果不实现Key#equals(),没有两个Key情况下将是相等的,所以Map#containsKey()总是返回false。此外,您正在检查containsKey(i),但未使用i作为关键字。即使您执行Key#equals(),那containsKey检查实际上是if(true)

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