Muitas respostas foram dadas, com base em considerações técnicas, especialmente em relação ao desempenho. Segundo mim, escolha entre TreeSet
e HashSet
importa.
Mas prefiro dizer que a escolha deve ser conduzida primeiro por considerações conceituais .
Se, para os objetos que você precisa manipular, uma ordem natural não faz sentido, não use TreeSet
.
É um conjunto classificado, pois é implementado SortedSet
. Portanto, isso significa que você precisa substituir a função compareTo
, que deve ser consistente com o que retorna a função equals
. Por exemplo, se você tiver um conjunto de objetos de uma classe chamada Student, não creio que umTreeSet
faria sentido, uma vez que não há ordenação natural entre os alunos. Você pode encomendá-los pela nota média, ok, mas isso não é um "pedido natural". A função compareTo
retornaria 0 não apenas quando dois objetos representam o mesmo aluno, mas também quando dois alunos diferentes têm a mesma nota. No segundo caso, equals
retornaria falso (a menos que você decida fazer com que o último retorne verdadeiro quando dois alunos diferentes tiverem a mesma nota, o que tornaria a equals
função um significado enganoso, sem dizer um significado errado.)
Observe esta consistência entre equals
e compareTo
é opcional, mas altamente recomendado. Caso contrário, o contrato da interface Set
será quebrado, tornando seu código enganoso para outras pessoas, resultando também em comportamento inesperado.
Esse link pode ser uma boa fonte de informações sobre esta questão.