6

equals() ではなく hashCode() が実装されているサンプルの 1 つで、メモリ リークのさまざまな理由を理解しようとしています。私はそれを読んだことがありますが、一方が乗り過ぎた場合、もう一方も契約違反のために乗り過ぎなければなりません。

これはサンプルコードです

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()、2 つのKeyインスタンスが等しくならないため、Map#containsKey()常に が返されfalseます。さらに、チェックしていますが、キーとして使用containsKey(i)していません。実装したとしても、そのチェックは効果的です。iKey#equals()containsKeyif(true)

したがって、このコードは論理的に異なるエントリを無条件にマップに追加するため、そのサイズは際限なく大きくなります。

于 2013-10-09T13:01:48.707 に答える