【问题标题】:why does not implementing equals method in Java cause memory leak为什么在Java中不实现equals方法会导致内存泄漏
【发布时间】:2013-10-09 12:59:42
【问题描述】:

我试图了解内存泄漏的各种原因,我看到的示例之一是实现 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() 方法。但我想了解为什么会在内部发生内存泄漏。

谢谢

【问题讨论】:

    标签: java memory-leaks


    【解决方案1】:

    如果您不实现Key#equals(),则不会有两个Key 实例相等,因此Map#containsKey() 将始终返回false。此外,您正在检查containsKey(i),但没有使用i 作为键。即使您确实实现了Key#equals()containsKey 检查实际上是if(true)

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

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多