Como funciona o metodo .equals() [RESOLVIDO]

14 respostas
guisantogui

Eu preciso saber exatamente como trabalha este metodo, por qual atributo ele mede a equivalencia dos objetos, por exemplo!

se eu comparar duas listas e elas tiverem mesmo tamanho, mas Objetos diferentes, ou até valores de atributos diferentes ele vai captar?

Vlw pela ajuda galera?

[EDIT]

Fiz o seguinte teste

List a = new ArrayList();
        List b = new ArrayList();

        Pessoa p = new Pessoa("a");
        Pessoa o = new Pessoa("b");
        Pessoa w = new Pessoa("c");
        Pessoa y = new Pessoa("d");

        a.add(p);
        b.add(o);
        a.add(w);
        b.add(y);

        if(a.equals(b)){
            System.out.println("Naum pega atr dif");
        }
        else{
            System.out.println("pega atr dif");
        }

e mesmo com a inicialização do construtor igual ou diferente ele cai no else, por que?

14 Respostas

E

http://java.sun.com/javase/6/docs/api/java/util/AbstractList.html#equals(java.lang.Object)

Ele diz que

OK?

Marky.Vasconcelos

E o método equals da classe ArrayList não compara todos os itens para ver se são iguais. Até onde eu sei.

guisantogui

Humm, vlw galera!
Vou ter q pensar em mais uma opção para isso! :confused:

ViniGodoy

Primeiro de tudo, você criou o método equals para a classe Pessoa?

Segundo, como você dirá que duas listas são iguais? Obviamente, elas tem que ter os mesmos elementos, mas precisam estar na mesma ordem?

Se precisarem, seu método equals pode ser, simplesmente:

public void <T> equals(List<T> listaA, List<T> listaB) {
   if (listaA.size() != listaB.size())
      return false;

   Iterator<T> itA = listaA.iterator();
   Iterator<T> itB = listaB.iterator();

   while (itA.hasNext()) {
      T a = itA.next();
      T b = itB.next();
      if (!a.equals(b))   
          return false;
    }
    return true;
}

Se bastar que as duas tenham os mesmos elementos, não interessando a ordem ou a quantidade de vezes que eles aparecem, você pode fazer assim:

public void <T> sameElements(Collection<T> listaA, Collection<T> listaB) {
   Set setA = new HashSet<T>(listaA);
   Set setB = new HashSet<T>(listaB);

   setA.removeAll(listaB);
   setB.removeAll(listaA);

   return setA.size() == 0 && setB.size() == 0;
}

Note que para esses métodos funcionarem, os métodos Equals e HashCode da classe pessoa devem estar corretamente implementados.

guisantogui

Humm, mas vinny, isso também vale se algum atributo de um Objeto for diferente do mesmo atributo de outro Objeto

ViniGodoy

Isso vai depender de como você implementou o equals da classe Pessoa.

Se vc não implementou nada, ele compara pelo endereço de memória. Portanto, mesmo duas pessoas de atributos idênticos, se forem objetos distintos, serão considerados diferentes.

Se você implementar um equals diferente, você pode dar uma definição de igualdade diferente. Por exemplo, vc pode considerar que pessoas de ID igual são iguais, ou comparar atributo por atributo, fica a teu cargo.

Marky.Vasconcelos
public void <T> sameElements(Collection<T> listaA, Collection<T> listaB) {
   Set<T> setA = new HashSet<T>(listaA);
   Set<T> setB = new HashSet<T>(listaB);

   setA.removeAll(listaB);
   setB.removeAll(listaA);

   return setA.size() == 0 && setB.size() == 0;
}

Gostei dessa solução. Entretanto se a ListaA tiver elementos repetidos esse método ira falhar. Mas é facil alterar para que veja o tamanho antes e depois da list.

ViniGodoy

Ué, irá falhar pq? Como ambas as listas são copiadas para um set, não existirá duplicatas.

Como eu falei, esse método só testa se ambos os elementos estão presentes nas duas listas. Sem se preocupar em quantas vezes aparecem, ou com ordem.

guisantogui

Ah, valeu vinny me abriu os olhos em relação de como é feita a comparação com o equals(), acho q resolvido!

Marky.Vasconcelos

Ué, irá falhar pq? Como ambas as listas são copiadas para um set, não existirá duplicatas.

Como eu falei, esse método só testa se ambos os elementos estão presentes nas duas listas. Sem se preocupar em quantas vezes aparecem, ou com ordem.

É, verdade, voce avisou que desconsideraria isso.

Eu considerei que uma lista com 3 objetos iguais seria diferente de outra lista que só tem 1.
E pra esse caso é só alterar para ver o tamanho.

pmlm

Mark_Ameba:

Eu considerei que uma lista com 3 objetos iguais seria diferente de outra lista que só tem 1.
E pra esse caso é só alterar para ver o tamanho.

Não exactamente. AAB e ABB teriam o mesmo tamanho (3), os mesmos elementos (A e B) e seriam diferentes

Marky.Vasconcelos

pmlm:
Mark_Ameba:

Eu considerei que uma lista com 3 objetos iguais seria diferente de outra lista que só tem 1.
E pra esse caso é só alterar para ver o tamanho.

Não exactamente. AAB e ABB teriam o mesmo tamanho (3), os mesmos elementos (A e B) e seriam diferentes

Isso que eu quis dizer, no Set voce teria duas list uma com A/B e outra com A/B também, mesmo sendo diferentes.

pmlm

Certo. Mas não bastava ver o tamanho para saber se eram iguais.

ViniGodoy

Depende mesmo é de sua definição de igual.

Criado 24 de junho de 2010
Ultima resposta 25 de jun. de 2010
Respostas 14
Participantes 5