2013-10-09 1 views
6

J'essaie de comprendre différentes raisons pour la fuite de mémoire un des échantillons que j'ai vu où hashCode() a été implémenté et non égal à(). J'ai lu par celui-là que si l'un est dépassé, l'autre doit aussi être surmonté à cause de la violation du contrat.pourquoi n'implémente pas la méthode equals en Java provoque une fuite de mémoire

c'est l'exemple de code

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); 
} 
} 

Je sais que je ne l'ai pas mis en œuvre la méthode equals() sur le but. Mais je veux comprendre pourquoi la fuite de mémoire est créée ce qui se passe en interne.

grâce

Répondre

11

Si vous ne mettre en œuvre Key#equals(), pas deux cas Key seront égaux, donc Map#containsKey() vaudra toujours false. En outre, vous vérifiez containsKey(i), mais ne pas utiliser i comme une clé. Même si vous avez implémenté Key#equals(), cette vérification containsKey est effectivement if(true).

Par conséquent, ce code ajoute inconditionnellement des entrées logiquement distinctes à la carte, de sorte que sa taille augmente sans limite.

Questions connexes