Objeto
public class Cat {
private String nome;
private int idade;
public Cat(String anome, int aidade) {
nome = anome;
idade = aidade;
}
public String getNome() {
return nome;
}
public int getIdade() {
return idade;
}
public String toString() {
return nome;
}
}
Set (HashSet, TreeSet) não permite duplicata.
HashSet<Cat> lista = new HashSet<Cat>();
Cat gato1 = new Cat("Mimi", 1);
Cat gato2 = new Cat("Chip", 1);
lista.add(gato1);
lista.add(gato2);
lista.add(gato1); // esta linha não conseguirá incluir o gato1 novamente (retorna false)
System.out.println(lista);
O que torna 2 objetos iguais?
Os métodos hashCode e equals
O JVM compara o hashCode dos dois objetos. Se forem iguais, irá chamar o equals, se forem iguais são considerados o mesmo objeto
Veja o código:
HashSet<Cat> lista = new HashSet<Cat>();
Cat gato1 = new Cat("Mimi", 1);
Cat gato2 = new Cat("Chip", 2);
Cat gato3 = new Cat("Pixixiu", 1);
lista.add(gato1);
lista.add(gato2);
lista.add(gato3);
System.out.println(lista);
Neste caso os 3 gatos serão incluídos na lista...
Vamos fazer o Cat ser igual se tiver a mesma idade, independente de nome.
Objeto 2
public class Cat {
private String nome;
private int idade;
public Cat(String anome, int aidade) {
nome = anome;
idade = aidade;
}
public String getNome() {
return nome;
}
public int getIdade() {
return idade;
}
public String toString() {
return nome;
}
// pulo do gato
public boolean equals(Object outro) {
Cat c = (Cat) outro;
return (idade == c.getIdade());
}
// pulo do gato 2
public int hashCode() {
return idade;
}
}
Agora se executarmos o programa, o gato3 não entrará na lista, pois o JVM usará o equals e será igual do gato1.
Listas ordenadas
TreeSet<String> lista = new TreeSet<String>();
lista.add("Chip");
lista.add("Ananias");
lista.add("Zabumba");
System.out.println(lista);
Saída: [Ananias, Chip, Zabumba]
Lembre-se o objeto a ser comparado deve implementar a interface Comparable e implementar o método compareTo
Atenção: mais lento