313 votes

Comment la méthode contains () d'ArrayList évalue-t-elle les objets?

Dis-je en créer un objet et de l'ajouter à ma ArrayList. Si je puis créer un autre objet avec exactement le même constructeur, seront l' contains() méthode de d'évaluer les deux objets à la même chose? Supposons que le constructeur ne veut pas faire quelque chose de drôle avec l'entrée, et les variables stockées dans les deux objets sont identiques.

ArrayList<Thing> basket = new ArrayList<Thing>();  
Thing thing = new Thing(100);  
basket.add(thing);  
Thing another = new Thing(100);  
basket.contains(another); // true or false?

class Thing {  
    public int value;  

    public Thing (int x) {
        value = x;
    }

    equals (Thing x) {
        if (x.value == value) return true;
        return false;
    }
}

Est-ce ainsi que l' class doit être mise en oeuvre pour contains() rendement true?

354voto

Binary Nerd Points 6497

ArrayList implements l'interface de liste.

Si vous regardez la Javadoc pour List à la méthode contains vous verrez qu'elle utilise la méthode equals() pour évaluer si deux objets sont identiques.

54voto

ChristopheCVB Points 4355

Je pense que les bonnes implémentations devraient être

 public class Thing
{
    public int value;  

    public Thing (int x)
    {
        this.value = x;
    }

    @Override
    public boolean equals(Object object)
    {
        boolean sameSame = false;

        if (object != null && object instanceof Thing)
        {
            sameSame = this.value == ((Thing) object).value;
        }

        return sameSame;
    }
}
 

15voto

Bhushan Bhangale Points 6284

ArrayList utilise la méthode equals implémentée dans la classe (votre cas Thing class) pour effectuer la comparaison des égalités.

12voto

alexloh Points 644

Généralement, vous devriez également de remplacer hashCode() chaque fois que vous remplacez equals(), même si c'est juste pour le gain de performance. HashCode() qui décide du "seau" votre objet devient triés sur quand faire une comparaison, de sorte que toute les deux objets dont l'égalité() renvoie true renvoie le même hashCode de la valeur(). Je ne me souviens pas le comportement par défaut de hashCode() (si elle retourne 0 alors votre code devrait fonctionner, mais lentement, mais si elle renvoie l'adresse puis votre code suivant ne fonctionnera pas). Je me souviens d'un tas de fois lors de mon code a échoué parce que j'ai oublié de remplacer hashCode (). :)

7voto

Yishai Points 42417

Il utilise la méthode égale sur les objets. Donc, à moins que Thing redéfinisse égal et utilise les variables stockées dans les objets pour la comparaison, il ne retournera pas vrai sur la méthode contains() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X