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