Muitas respostas foram dadas, com base em considerações técnicas, especialmente em relação ao desempenho. Segundo mim, escolha entre TreeSete HashSetimporta.
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 umTreeSetfaria 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 compareToretornaria 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, equalsretornaria 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 equalsfunção um significado enganoso, sem dizer um significado errado.)
Observe esta consistência entre equalse compareToé opcional, mas altamente recomendado. Caso contrário, o contrato da interface Setserá 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.