Pessoal…
tenho dois arrayslist… e preciso comparar se os itens que neles são iguais…
alguma dica.
estou tentando fazer um for each dentro do outro…
vlw
Pessoal…
tenho dois arrayslist… e preciso comparar se os itens que neles são iguais…
alguma dica.
estou tentando fazer um for each dentro do outro…
vlw
Oi!
E com os for´s aninhados, não foi possível?
Ou simplesmente procuras uma solução mais elegante?
E por fim, que tipo de objeto está comparando?
Olá, Rafael.
Como assim “iguais”?
Se são o mesmo objeto -> use apenas “.equals()”
Se possuem os mesmo elementos dentro -> use “removeAll([outra lista])”. Se sobrar alguma coisa dentro da primeira é porque não eram iguais.
Se possuem os mesmo elementos dentro e na mesma ordem -> Bem… essa eu resolveria com “for” mesmo 
Espero ter ajudado.
Assim:
arrayList.equals(otherArrayList);
Ele vai retornar verdadeiro se o objeto passado como parametro tambem for uma lista, de mesmo tamanho e se cada objeto da lista forem iguais (atraves do metodo equals de cada objeto) e estiverem dispostos na mesma ordem.
=D
referência: http://download.oracle.com/javase/6/docs/api/index.html
assim pessoal…
for(ItemNota item1: nota1.getItens()){
item1.getValorProduto();
for(ItemNota item2: nota2.getItens()){
itemNfe.getValorProduto();
if(item1.getValorProduto().equals(item2.getValorProduto())){
System.out.println("são iguais!");
}
}
}
tenho que comparar os valores dos itens de duas notas
para verificar se certo…igual…
se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…
é só usar o equals do AbstractList que o ArrayList herda…
¬¬"
mas precisamos saber se as ordens das listas são iguais, ou se não sabes a ordem das mesmas ???
se forem exatamente na mesma ordem, não precisas de 2 fors, basta pegar o elemento da segunda lista com base no índice da 1ª.
Se forem diferentes, aí sim, terás que percorrer a segunda, até achar o item da primeira que está na iteração e comparar os valores.
Abs []
se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…é só usar o equals do AbstractList que o ArrayList herda…
¬¬"
Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.
Só um detalhe, até funciona, mas ele teria que sobrescrever o método equals da classe criada por ele 
se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…é só usar o equals do AbstractList que o ArrayList herda…
¬¬"
Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.
quando o for passa na primeira vez ele pega os primeiro valores corretos e depois compara certinho…
porem, na segunda vez ele se perde, pegando trocado…
esses for estão certos?
tipo…não tem erro de lógica ai?
vlw
se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…é só usar o equals do AbstractList que o ArrayList herda…
¬¬"
Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.quando o for passa na primeira vez ele pega os primeiro valores corretos e depois compara certinho…
porem, na segunda vez ele se perde, pegando trocado…
esses for estão certos?
tipo…não tem erro de lógica ai?
vlw
É como o JM4X explicou, os objetos precisam estar ordenados da mesma forma, caso contrário, não será válido.
Vamos supor que o Objeto da posição 0 é o mesmo da posição 10 da outra lista, vai dar false, quando na verdade, poderia ser true.
Sendo assim, para usar o equals da interface List, você precisa de duas etapas:
1 - Organizar ambas as listas da mesma forma (Podes criar uma classe que implementa o Comparator, depois o método sort() para organizar)
2 - Sobrescrever o método equals do seu objeto “Itemnota”
Fora isso, creio que somente for aninhados. De qualquer forma, aconselho fortemente a organizar as listas antes de compara-las.
Abraços.
mas precisamos saber se as ordens das listas são iguais, ou se não sabes a ordem das mesmas ???se forem exatamente na mesma ordem, não precisas de 2 fors, basta pegar o elemento da segunda lista com base no índice da 1ª.
Se forem diferentes, aí sim, terás que percorrer a segunda, até achar o item da primeira que está na iteração e comparar os valores.
Abs []
a ordem é o que vem do DB…
não é ordenada…
se tiver implementado o metodo equals para os objetos que estiverem dentro do ArrayList nao precisa do for…é só usar o equals do AbstractList que o ArrayList herda…
¬¬"
Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.quando o for passa na primeira vez ele pega os primeiro valores corretos e depois compara certinho…
porem, na segunda vez ele se perde, pegando trocado…
esses for estão certos?
tipo…não tem erro de lógica ai?
vlw
É como o JM4X explicou, os objetos precisam estar ordenados da mesma forma, caso contrário, não será válido.
Vamos supor que o Objeto da posição 0 é o mesmo da posição 10 da outra lista, vai dar false, quando na verdade, poderia ser true.
Sendo assim, para usar o equals da interface List, você precisa de duas etapas:1 - Organizar ambas as listas da mesma forma (Podes criar uma classe que implementa o Comparator, depois o método sort() para organizar)
2 - Sobrescrever o método equals do seu objeto “Itemnota”Fora isso, creio que somente for aninhados. De qualquer forma, aconselho fortemente a organizar as listas antes de compara-las.
Abraços.
blz vlw…vou ver isso
Pelo que entendi então removeAll() resolve teu problema com poucas linhas, independente da ordem dos elementos.
if (nota1.getItens().size()!=nota2.getItens().size())
return false; // não precisa testar mais nada. Se não possuem mesmo tamanho, são diferentes.
List listaTmp = new ArrayList();
listaTmp.addAll(nota1.getItens());
listaTmp.removeAll(nota2.getItens());
boolean eIgual = (listaTmp.size()==0);
Não apliquei o removeAll() direto na nota1.getItens() ou na nota2.getItens() por poder ter efeito colateral no restante do teu código.
Algo me diz que o equals não funciona para objetos como o dele, somente Wrappers.
No caso dele ele criou uma classe com determinados atributos e quer saber se os mesmo são iguais, o equals não vai rolar.
Fala nel, parece-me que também não funciona com Strings…
Abs []
Pelo que entendi então removeAll() resolve teu problema com poucas linhas, independente da ordem dos elementos.if (nota1.getItens().size()!=nota2.getItens().size()) return false; // não precisa testar mais nada. Se não possuem mesmo tamanho, são diferentes. List listaTmp = new ArrayList(); listaTmp.addAll(nota1.getItens()); listaTmp.removeAll(nota2.getItens()); boolean eIgual = (listaTmp.size()==0);Não apliquei o removeAll() direto na nota1.getItens() ou na nota2.getItens() por poder ter efeito colateral no restante do teu código.
cara mas se eu quiser saber o item que deu problema? tipo nesse getItens
tenho valor, quantidade....
digamos que o valor ficou diferente do outro...
entendeU?
vlw pela força!!
Bom… eu fiz um teste… não sei se a idéia foi correta, mas só funcionou iterando sobre as 2 listas:
package testesjava;
public class Pessoa {
private int codigo;
private String nome;
public Pessoa(int codigo, String nome){
this.codigo = codigo;
this.nome = nome;
}
public int getCodigo() { return codigo; }
public String getNome() { return nome; }
public boolean equals(Object o) {
Pessoa pc = (Pessoa) o;
if(this.codigo == pc.getCodigo()){
return true;
}
return false;
}
}
Pessoa p1 = new Pessoa(1, "Adriano");
Pessoa p2 = new Pessoa(2, "Carlos");
Pessoa p3 = new Pessoa(3, "Alfredo");
List<Pessoa> l1 = new ArrayList<Pessoa>();
List<Pessoa> l2 = new ArrayList<Pessoa>();
l1.add(p1);
l1.add(p2);
l2.add(p3);
l2.add(p1);
for(Pessoa p : l1) // Aqui não funcionou, não sei se está certo a forma que usei, mas foi assim que entendi que era o uso
if(l2.equals(p))
System.out.println("O [" + p.getNome() + "] existe nas 2 listas");
for(Pessoa p : l1) // Aqui foi normal. Ou seja, como ele já estava fazendo.
for(Pessoa pes : l2)
if(p.equals(pes))
System.out.println("O [" + p.getNome() + "] existe nas 2 listas");
Simples.
Os itens que sobrarem em listaTmp após o removeAll() representam os item diferentes de uma lista para outra.
esquece :{ inglês enferrujado é osso…
Relendo com calma, entendi… Precisa primeiro ordenar a lista ´pra depois validar se são iguais…
Simples.Os itens que sobrarem em listaTmp após o removeAll() representam os item diferentes de uma lista para outra.
Acho que resolve o seu problema não ??? agora resta saber se podes remover os elementos da 2ª lista…
PS: Yoshi, não tens vergonha de colocar uma foto dormindo em sala de aula ?? heuehue
Pois é… por isso sugeri a criação de uma lista temporária. Inicialmente ela recebe o conteúdo integral de uma das listas e depois os itens são removidos dela e não da original.
É que sou dorminhoco… meu apelido na faculdade era “Garfield”. Essa foto reflete a realidade rsrsrsr
Simples.Os itens que sobrarem em listaTmp após o removeAll() representam os item diferentes de uma lista para outra.
cara…
não sei se estou fazendo errado…
mas dei um print do listaTmp e ele remove tudo da nota2
Amigo, você deve invocar removeAll() no listaTemp. Não tem como isso remover itens de nota2.
A não ser que você tenha feitolistaTemp = nota2.getItens();
listaTemp.addAll(nota2.getItens()); // ou nota1.getItens(), tanto faz.
List l1 = new ArrayList();
List l2 = new ArrayList();
l1.add("oi");
l1.add("olá");
l1.add("boa tarde");
l2.add("oi");
l2.add("olá");
List lt = new ArrayList();
lt.addAll(l1);
lt.removeAll(l2);
System.out.println(l1);
System.out.println(l2);
System.out.println(lt);
A saída foi
[oi, olá, boa tarde]
[oi, olá]
[boa tarde]
Amigo, você deve invocar removeAll() no listaTemp. Não tem como isso remover itens de nota2. A não ser que você tenha feitoIsso tá errado. Deveria serlistaTemp = nota2.getItens();Olha esse código que fiz agora:listaTemp.addAll(nota2.getItens()); // ou nota1.getItens(), tanto faz.List l1 = new ArrayList(); List l2 = new ArrayList(); l1.add("oi"); l1.add("olá"); l1.add("boa tarde"); l2.add("oi"); l2.add("olá"); List lt = new ArrayList(); lt.addAll(l1); lt.removeAll(l2); System.out.println(l1); System.out.println(l2); System.out.println(lt);A saída foi
[oi, olá, boa tarde]
[oi, olá]
[boa tarde]
Opa...
eu to fazendo assim o:List listaTmp = new ArrayList();
listaTmp.addAll(nota1.getItens());
listaTmp.removeAll(nota2.getItens());
System.out.println("nota1:"+nota1.getItens());
System.out.println("nota2:"+nota2.getItens());
System.out.println("lista final:"+listaTmp);
porem no meu a saída é:
nota1:valorProduto: 15.15 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0]
notanfe:valorProduto: 8.1 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0
lista final:valorProduto: 8.1 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0
tipo não era para aparecer só o valorProduto: 15.15 ?
Amigo, você deve invocar removeAll() no listaTemp. Não tem como isso remover itens de nota2. A não ser que você tenha feitoIsso tá errado. Deveria serlistaTemp = nota2.getItens();Olha esse código que fiz agora:listaTemp.addAll(nota2.getItens()); // ou nota1.getItens(), tanto faz.List l1 = new ArrayList(); List l2 = new ArrayList(); l1.add("oi"); l1.add("olá"); l1.add("boa tarde"); l2.add("oi"); l2.add("olá"); List lt = new ArrayList(); lt.addAll(l1); lt.removeAll(l2); System.out.println(l1); System.out.println(l2); System.out.println(lt);A saída foi
[oi, olá, boa tarde]
[oi, olá]
[boa tarde]Opa...
eu to fazendo assim o:List listaTmp = new ArrayList(); listaTmp.addAll(nota1.getItens()); listaTmp.removeAll(nota2.getItens()); System.out.println("nota1:"+nota1.getItens()); System.out.println("nota2:"+nota2.getItens()); System.out.println("lista final:"+listaTmp);porem no meu a saída é:
nota1:valorProduto: 15.15 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0]nota2:valorProduto: 8.1 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0lista final:valorProduto: 8.1 QTD: 400.0,
valorProduto: 55113.08 QTD: 7139.0tipo não era para aparecer só o valorProduto: 15.15 ?
como vou saber qual item ficou diferente?
tipo, ListaTmp.get.....alguma coisa?
Realmente, por essas saídas que você mostrou algo está errado.
Você sobrescreveu o método “equals()” da classe de onde tira os “getItens()”?
E tem certeza que o código que colou no teu post está 100% igual ao que você compilou e testou?
Realmente, por essas saídas que você mostrou algo está errado.
Você sobrescreveu o método “equals()” da classe de onde tira os “getItens()”?E tem certeza que o código que colou no teu post está 100% igual ao que você compilou e testou?
cara…
não sobrescrevi o método equals…
e o código é esse…
:C
Realmente, por essas saídas que você mostrou algo está errado.
Você sobrescreveu o método “equals()” da classe de onde tira os “getItens()”?E tem certeza que o código que colou no teu post está 100% igual ao que você compilou e testou?
cara…
não sobrescrevi o método equals…
e o código é esse…
:C
Então, sobrescreva o equals amigo, ai vai funcionar 
O que me deixou “com a pulga atrás da orelha” foi que você adicionou todos os itens de nota1 à listaTemp depois pediu aplicou um removeAll() em listaTemp passando como parâmetro a nota2. No fim o conteúdo que sobra na listaTemp é o mesmo conteúdo da nota2. Isso é digamos… impossível rsrsrs.
O método [b]removeAll/b, segundo seu relato, simplesmente substituiu itens de uma coleção e isso é impossível em condições normais. A não ser que esteja rolando uma Thread que fica alterando os itens da lista… única explicação e olhe lá.
Por isso te perguntei se o código era esse mesmo do post.
Realmente, por essas saídas que você mostrou algo está errado.
Você sobrescreveu o método “equals()” da classe de onde tira os “getItens()”?E tem certeza que o código que colou no teu post está 100% igual ao que você compilou e testou?
cara…
não sobrescrevi o método equals…
e o código é esse…
:C
Então, sobrescreva o equals amigo, ai vai funcionar :)
cara…não leva a mau…
mas como sobrescrevo o equals…
assim?
public String equals(){
}
Já sei! Tive uma ideia: Acredito que o problema esteja nos métodos “getItens()” de suas “nota1” e “nota2”.
Como está o corpo desse método?
Amigo, recomendo fortemente que não sobrescreva o equals(). Isso só se faz em casos bem específicos mesmo e não me parece o caso.
Já sei! Tive uma ideia: Acredito que o problema esteja nos métodos “getItens()” de suas “nota1” e “nota2”.Como está o corpo desse método?
Amigo, recomendo fortemente que não sobrescreva o equals(). Isso só se faz em casos bem específicos mesmo e não me parece o caso.
ok…
cara…ta assim
tenho uma classe nota
e uma classe item
na classe nota coloco List itens
e getters setters…
e quando instancio um objeto atribuo os valores dos itens…
public List<ItemNota> getItens() {
return itens;
}
public void setItens(List<ItemNota> itens) {
this.itens = itens;
}
Amigo, tem alguma coisa passando batida no teu código...
Olha esse código que fiz agora:public class TesteListas {
/**
* @param args
*/
public static void main(String[] args) {
List<ItemNota> l1 = new ArrayList();
List<ItemNota> l2 = new ArrayList();
ItemNota in1 = new ItemNota("Abacaxi",10.0);
ItemNota in2 = new ItemNota("Laranja",8.0);
ItemNota in3 = new ItemNota("Tomate",4.0);
l1.add(in1);
l1.add(in2);
l1.add(in3);
l2.add(in1);
l2.add(in2);
Nota nota1 = new Nota();
nota1.setItens(l1);
Nota nota2 = new Nota();
nota2.setItens(l2);
List lt = new ArrayList();
lt.addAll(nota1.getItens());
lt.removeAll(nota2.getItens());
System.out.println("lista1: "+nota1.getItens());
System.out.println("lista2: "+nota2.getItens());
System.out.println("listatemp: "+lt);
}
}
class ItemNota {
String nome;
Double valor;
public ItemNota(String nome, Double valor) {
super();
this.nome = nome;
this.valor = valor;
}
@Override
public String toString() {
return nome+" - "+valor;
}
}
class Nota {
List<ItemNota> itens;
public List<ItemNota> getItens() {
return itens;
}
public void setItens(List<ItemNota> itens) {
this.itens = itens;
}
}
Era algo assim que deveria acontecer no teu código. Mas, pelo teu relato, o conteúdo da lista temporária foi substituído! Increcrible! rsrsrs
O que parece é que, na verdade, teu código parece ser:
listaTmp.addAll(nota2.getItens()); // nota2 e não nota1
listaTmp.removeAll(nota1.getItens()); // nota1 e não nota2
É a única maneira de a saída ter ficado como ficou.
Oi!
Como já dei minha sugestão, encerro por aqui dizendo que provavelmente o problema está na forma de como está trabalhando com a referência dos objetos.
Se alterar uma referência, mesmo que o objeto esteja contido em uma lista, esse objeto sofrerá as mesmas alterações, tenha cuidado com isso.
Sobre o equals(), vejo que esse é um caso específico sim, pois ele precisa comparar o objeto dele, creio que isso centralizaria o seu problema.
Mas enfim, opinião foi dada.
Abraços amigo!
bopm Yoshi, fiz o seguinte teste:
List<ItemNota> l1 = new ArrayList();
List<ItemNota> l2 = new ArrayList();
ItemNota in1 = new ItemNota("Abacaxi",10.0);
ItemNota in2 = new ItemNota("Laranja",8.0);
ItemNota in3 = new ItemNota("Tomate",4.0);
ItemNota in4 = new ItemNota("Abacaxi",10.0);
ItemNota in5 = new ItemNota("Laranja",8.0);
l1.add(in1);
l1.add(in2);
l1.add(in3);
l2.add(in4);
l2.add(in5);
Nota nota1 = new Nota();
nota1.setItens(l1);
Nota nota2 = new Nota();
nota2.setItens(l2);
List lt = new ArrayList();
lt.addAll(nota1.getItens());
lt.removeAll(nota2.getItens());
System.out.println("lista1: "+nota1.getItens());
System.out.println("lista2: "+nota2.getItens());
System.out.println("listatemp: "+lt);
Aí o resultado foi diferente pois não apontava para o mesmo objeto, de repente está sendo feita 2 consultas que faz com que os objetos ItemNota dele sejam diferentes… Aí pra funcionar seu código tive que fazer na classe ItemNota
public boolean equals(Object o){
ItemNota in = (ItemNota) o;
if(this.nome.equals(in.nome) && this.valor.equals(in.valor))
return true;
return false;
}
Enfim, deve ser alterado pra sua realidade… Acho que é o único motivo pelo qual o removeAll não está excluindo os itens da lista 2… A menos que não sejam 2 consultas e o fato de inverter
listaTmp.addAll(nota2.getItens()); // nota2 e não nota1
listaTmp.removeAll(nota1.getItens()); // nota1 e não nota2
realmente funcione.
espero ter ajudado.
Abs []
Oi,
Você precisa comparar os elementos deste array para qual objetivo? Remove-los? Tornar apenas 1 só lista com os números iguais?
Tchauzin!
Pois é, Adriano, eu entendi sua colocação.
Mas a questão é como ele preenche essas listas antes de comparar seus conteúdos.
Se preenche via ORM (hibernate, jpa, etc) os objetos ficam com a mesma referência em memória quando originados do mesmo objeto gerenciado (Session ou EntityManager), mesmo que vindos de consultas diferentes.
Se o caso do nosso amigo for comparar realmente o conteúdo de cada ItemNota, nesse caso tem que sobrescrever os equals() e o hashCode(), infelizmente.
bopm Yoshi, fiz o seguinte teste:List<ItemNota> l1 = new ArrayList(); List<ItemNota> l2 = new ArrayList(); ItemNota in1 = new ItemNota("Abacaxi",10.0); ItemNota in2 = new ItemNota("Laranja",8.0); ItemNota in3 = new ItemNota("Tomate",4.0); ItemNota in4 = new ItemNota("Abacaxi",10.0); ItemNota in5 = new ItemNota("Laranja",8.0); l1.add(in1); l1.add(in2); l1.add(in3); l2.add(in4); l2.add(in5); Nota nota1 = new Nota(); nota1.setItens(l1); Nota nota2 = new Nota(); nota2.setItens(l2); List lt = new ArrayList(); lt.addAll(nota1.getItens()); lt.removeAll(nota2.getItens()); System.out.println("lista1: "+nota1.getItens()); System.out.println("lista2: "+nota2.getItens()); System.out.println("listatemp: "+lt);Aí o resultado foi diferente pois não apontava para o mesmo objeto, de repente está sendo feita 2 consultas que faz com que os objetos ItemNota dele sejam diferentes… Aí pra funcionar seu código tive que fazer na classe ItemNota
public boolean equals(Object o){ ItemNota in = (ItemNota) o; if(this.nome.equals(in.nome) && this.valor.equals(in.valor)) return true; return false; }Enfim, deve ser alterado pra sua realidade… Acho que é o único motivo pelo qual o removeAll não está excluindo os itens da lista 2… A menos que não sejam 2 consultas e o fato de inverter
listaTmp.addAll(nota2.getItens()); // nota2 e não nota1 listaTmp.removeAll(nota1.getItens()); // nota1 e não nota2realmente funcione.
espero ter ajudado.
Abs []
Eai adriano_si e bopm Yosh,
fiz isso e funcionou…\O/
agora ele me mostra só o valor diferente!
Mas o engraçado é que não consegui da outra maneira…mas pessoal
agradeço ai pela tarde de ajuda!
Vlw mesmo! abraço!
Oi,Você precisa comparar os elementos deste array para qual objetivo? Remove-los? Tornar apenas 1 só lista com os números iguais?
Tchauzin!
cara preciso comparar para isso…para saber quais itens não estão iguais…
pegar os itens que nao sao iguais e enviar por email por exemplo…
Oi,Você precisa comparar os elementos deste array para qual objetivo? Remove-los? Tornar apenas 1 só lista com os números iguais?
Tchauzin!
cara preciso comparar para isso...para saber quais itens não estão iguais....
pegar os itens que nao sao iguais e enviar por email por exemplo....
Oi,
Pois é rapaz... estava aqui pensando pq não usar removeAll(Collection).
ArrayList
teste = new ArrayList();
teste.add("Lina");
teste.add("Ferreira");
teste.add("OK");
ArrayList
teste1 = new ArrayList();
teste1.add("Lina");
teste1.add("Ferreira");
teste.removeAll(teste1);
for (int ln = 0; ln < teste.size(); ln++)
System.out.println(teste.get(ln));
Só que a dúvida já foi respondida!
Tchauzin!
Rafael, qual foi a solução afinal ???
Temos 2 soluções no Post que você copiou,a minha iria se referir se estivesse retornando 2 consultas diferentes (sem usar ORM como já identificou o Yoshi) e a outra, é a mesma solução que o Yoashi deu, porém invertendo qual lista removia de qual, ou seja, mesmo sendo consultas diferentes as listas estavam referenciandos os mesmos objetos…
Abs []
Opa…
public boolean equals(Object o){
ItemNota in = (ItemNota) o;
if(this.nome.equals(in.nome) && this.valor.equals(in.valor))
return true;
return false;
}
Fiz isso e resolveu o problema.
vlw
Você não deve sobescrever somente o equals mas também o hashCode.
É muito importante entender os conceitos primários de igualdade em Java para podermos seguir adiante e utilizar com mais conforto o JAVA COLLECTIONS FRAMEWORK.
Este slide-show é muito bom e explica bem estes conceitos:
http://www.slideshare.net/elenilsonvieira/java-collections-tomaz-lavieri
Espero que o ajude assim como me ajudou.
Grande abraço!