Было дано много ответов, исходя из технических соображений, особенно в отношении производительности. По мне, выбор между TreeSet
и HashSet
имеет значение.
Но я бы сказал, что выбор должен основываться на концептуальных соображениях.
Если для объектов, которыми нужно манипулировать, естественный порядок не имеет смысла, то не используйте TreeSet
.
Это отсортированный набор, поскольку он реализует SortedSet
. Таким образом, это означает, что вам нужно переопределить функцию compareTo
, которая должна соответствовать возвращаемой функции equals
. Например, если у вас есть набор объектов класса с именем Student, то я не думаю, чтоTreeSet
будет иметь смысл, так как между студентами нет естественного порядка. Вы можете заказать их по средней оценке, хорошо, но это не «естественный порядок». Функция нарушается, что делает ваш код вводящим в заблуждение другими людьми, что также может привести к неожиданному поведению.compareTo
которая будет возвращать 0 не только тогда, когда два объекта представляют одного и того же учащегося, но и когда два разных учащегося имеют одинаковую оценку. Во втором случаеequals
вернет false (если вы не решите сделать последний возврат true, когда два разных ученика имеют одинаковую оценку, что придало бы equals
функции вводящее в заблуждение значение, а не неверное значение.)
Пожалуйста, обратите внимание, что согласованность между equals
и compareTo
является необязательной, но настоятельно рекомендуемые. В противном случае контракт интерфейсаSet
Эта ссылка может быть хорошим источником информации по этому вопросу.