Como funciona o metodo .equals() [RESOLVIDO]

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?

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

Ele diz que

OK?

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

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

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:

[code]public void equals(List listaA, List listaB) {
if (listaA.size() != listaB.size())
return false;

Iterator itA = listaA.iterator();
Iterator itB = listaB.iterator();

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

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.

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

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.

[code]
public void sameElements(Collection listaA, Collection listaB) {
Set setA = new HashSet(listaA);
Set setB = new HashSet(listaB);

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

return setA.size() == 0 && setB.size() == 0;
}[/code]

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.

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.

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

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.[/quote]

É, 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.

[quote=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.[/quote]

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

[quote=pmlm][quote=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.[/quote]

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

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.

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

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