Дано багато відповідей, виходячи з технічних міркувань, особливо щодо виконання. На мою думку, вибір між TreeSetі HashSetмає значення.
Але я б сказала, що вибір повинен спочатку спиратися на концептуальні міркування.
Якщо для об'єктів, якими потрібно маніпулювати, природне впорядкування не має сенсу, тоді не використовуйте TreeSet.
Це відсортований набір, оскільки він реалізує SortedSet. Таким чином, це означає, що вам потрібно перекрити функцію compareTo, яка повинна відповідати тій, що повертає функцію equals. Наприклад, якщо у вас є набір об'єктів класу під назвою Student, я не думаю, щоTreeSetце мало б сенс, оскільки немає природного впорядкування між студентами. Ви можете замовити їх за середньою оцінкою, добре, але це не "природне замовлення". Функція compareToповертає 0 не лише тоді, коли два об'єкти представляють одного учня, але і тоді, коли двоє різних учнів мають однакову оцінку. У другому випадку equalsповернеться помилковим (якщо ви не вирішите зробити останнє поверненням істинним, коли двоє різних учнів мають однакову оцінку, що зробить, що equalsфункція має оманливе значення, а не сказати неправильне значення.)
Зауважте, що ця послідовність між equalsі compareToнеобов’язково, але настійно рекомендується. Інакше контракт інтерфейсу Setрозірваний, що робить ваш код оманливим для інших людей, таким чином, також, можливо, призводить до несподіваної поведінки.
Це посилання може бути хорошим джерелом інформації щодо цього питання.