Porque nesse caso do TreeSet passando um Comparator no construtor o método contains funciona mesmo sem sebrescrever o hashcode()?
//rec3 = rec4 = rec5
System.out.println("A lista recibos contém rec5? " + recibos.contains(rec5));
Minha implementação:
package br.com.alura;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class TesteTreeSet {
public static void main(String[] args) {
Recibo rec1 = new Recibo();
rec1.setNome("Recibo1");
rec1.setNro(1);
Recibo rec2 = new Recibo();
rec2.setNome("Recibo2");
rec2.setNro(1);
Recibo rec3 = new Recibo();
rec3.setNome("Recibo3");
rec3.setNro(1);
Recibo rec4 = new Recibo();
rec4.setNome("Recibo3");
rec4.setNro(1);
Comparator<Recibo> comparator = new Comparator<Recibo>() {
@Override
public int compare(Recibo o1, Recibo o2) {
boolean ordemNatural = true;
if (o1.getNome().equals(o2.getNome()) && o1.getNro() == o2.getNro()) {
return 0;
} else if (ordemNatural) {
return 1;
} else {
return -1;
}
}
};
Set<Recibo> recibos = new TreeSet<>(comparator);
recibos.add(rec1);
recibos.add(rec2);
recibos.add(rec3);
recibos.add(rec4);
System.out.println(recibos);
Recibo rec5 = new Recibo();
rec5.setNome("Recibo3");
rec5.setNro(1);
//rec3 = rec4 = rec5
System.out.println("A lista recibos contém rec5? " + recibos.contains(rec5));
System.out.println("O rec4.hashcode() == rec5.hashcode()? " + (rec4.hashCode() == rec5.hashCode()));
}
}
class Recibo {
private String nome;
private int nro;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getNro() {
return nro;
}
public void setNro(int nro) {
this.nro = nro;
}
@Override
public String toString() {
return "Recibo [nome=" + nome + ", nro=" + nro + "]";
}
}