Se han dado muchas respuestas, basadas en consideraciones técnicas, especialmente en torno al rendimiento. Según yo, la elección entre TreeSety HashSetasuntos.
Pero preferiría decir que la elección debería basarse primero en consideraciones conceptuales .
Si, para los objetos que necesita manipular, un orden natural no tiene sentido, entonces no lo use TreeSet.
Es un conjunto ordenado, ya que se implementa SortedSet. Por lo tanto, significa que debe anular la función compareTo, que debe ser coherente con lo que devuelve la función equals. Por ejemplo, si tiene un conjunto de objetos de una clase llamada Estudiante, entonces no creo queTreeSettendría sentido, ya que no existe un orden natural entre los estudiantes. Puede ordenarlos por su calificación promedio, está bien, pero este no es un "orden natural". La función compareTodevolvería 0 no solo cuando dos objetos representan al mismo alumno, sino también cuando dos alumnos diferentes tienen la misma calificación. Para el segundo caso, equalsdevolvería falso (a menos que decida hacer que el último devuelva verdadero cuando dos estudiantes diferentes tienen la misma calificación, lo que haría que la equalsfunción tenga un significado engañoso, por no decir un significado incorrecto).
Tenga en cuenta esta coherencia entre equalsy compareToEs opcional, pero muy recomendable. De lo contrario, el contrato de interfaz Setse rompe, lo que hace que su código sea engañoso para otras personas, lo que posiblemente también conduzca a un comportamiento inesperado.
Este enlace podría ser una buena fuente de información sobre esta pregunta.