6

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

谢谢

4

1 回答 1

11

如果你不实现Key#equals(),没有两个Key实例是相等的,所以Map#containsKey()总是返回false。此外,您正在检查containsKey(i),但不用i作键。即使您确实实施Key#equals()了,该containsKey检查也是有效的if(true)

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

于 2013-10-09T13:01:48.707 回答