Isso ocorre porque o == compara a referência na memória para o objeto. Como l1 e l2 referenciam objetos diferentes, o resultado será sempre false.
Já o equals() compara os valores dos objetos. No caso do exemplo, vai retornar true.
MrDataFlex
Ele ainda permite cadastrar id´s iguais!
PS: tirei o implements comparable …
;/
sergiotaborda
MrDataFlex:
Pessoal, como sabem, Set não deixa repetir objetos, e ela faz esta comparação com base no método equals dos objetos, certo?
Não. A interface Set não faz nada. É uma interface. São as implementações de Set que não deixam que os objetos se repitam. Elas fazem isso porque é o contrato da interface Set. Como elas fazem isso depende da implementação.
O HashSet usa os métodos equals e hashCode para diferenciar os objetos. O TreeSet não usa o equals nem o hashCode. Por isso o seu codigo não funciona. O TreeSet assume que os objetos são Comparable. Ou seja que implementam compareTo(). Se os objetos que está usando não são comparable então tem que passar um Comparator no contrutor do TreeSet.
Se os seus objetos não poderem ser ordenados use HashSet. Se podem, use TreeSet.
Carro não é um objeto ordenável ( como se define se o carro A é menor que o carro B?) por isso
use HashSet
MrDataFlex
sergiotaborda:
MrDataFlex:
Pessoal, como sabem, Set não deixa repetir objetos, e ela faz esta comparação com base no método equals dos objetos, certo?
Não. A interface Set não faz nada. É uma interface. São as implementações de Set que não deixam que os objetos se repitam. Elas fazem isso porque é o contrato da interface Set. Como elas fazem isso depende da implementação.
O HashSet usa os métodos equals e hashCode para diferenciar os objetos. O TreeSet não usa o equals nem o hashCode. Por isso o seu codigo não funciona. O TreeSet assume que os objetos são Comparable. Ou seja que implementam compareTo(). Se os objetos que está usando não são comparable então tem que passar um Comparator no contrutor do TreeSet.
Se os seus objetos não poderem ser ordenados use HashSet. Se podem, use TreeSet.
Carro não é um objeto ordenável ( como se define se o carro A é menor que o carro B?) por isso
use HashSet
Valeu sérgio, mas tipo. eu já subscrevi o método equals, assim :
porém o set / HashSet está deixando eu add objetos com o mesmo id…
Leia o que eu disse. Vc não sobreescreveu hashCode por isso não funciona.
publicbooleanequals(Objectother){
returnoinstanceofAutor&&equals((Autor)other);}
publicbooleanequals(Autorother){
returnother.getId().equals(this.getId()); // atenção que o ID pode ser null e ai dá pau}
publicinthashCode(){
returngetId().hashCode(); // atenção que o ID pode ser null e ai dá pau}