2013-10-09 24 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)

因此,此代碼無條件地將邏輯上不同的條目添加到映射中,因此其大小無限制地增長。