Rất nhiều câu trả lời đã được đưa ra, dựa trên những cân nhắc kỹ thuật, đặc biệt là về hiệu suất. Theo tôi, sự lựa chọn giữa TreeSetvà HashSetvấn đề.
Nhưng tôi muốn nói rằng sự lựa chọn nên được thúc đẩy bởi những cân nhắc về khái niệm đầu tiên.
Nếu, đối với các đối tượng bạn cần thao tác, một trật tự tự nhiên không có ý nghĩa, thì không sử dụng TreeSet.
Nó là một tập hợp được sắp xếp, vì nó thực hiện SortedSet. Vì vậy, nó có nghĩa là bạn cần ghi đè chức năng compareTo, phải phù hợp với chức năng trả về equals. Ví dụ: nếu bạn có một tập hợp các đối tượng của một lớp gọi là Học sinh, thì tôi không nghĩ làTreeSetsẽ có ý nghĩa, vì không có trật tự tự nhiên giữa các sinh viên. Bạn có thể đặt hàng theo cấp trung bình của họ, được thôi, nhưng đây không phải là "thứ tự tự nhiên". Hàm compareTosẽ trả về 0 không chỉ khi hai đối tượng đại diện cho cùng một học sinh mà cả khi hai học sinh khác nhau có cùng một lớp. Đối với trường hợp thứ hai, equalssẽ trả về false (trừ khi bạn quyết định biến trường sau trở thành đúng khi hai học sinh khác nhau có cùng một lớp, điều này sẽ khiến equalshàm có nghĩa sai, không nói nghĩa sai.)
Xin lưu ý sự thống nhất này giữa equalsvà compareTolà tùy chọn, nhưng rất khuyến khích. Nếu không, hợp đồng giao diện Setbị phá vỡ, làm cho mã của bạn gây hiểu lầm cho người khác, do đó cũng có thể dẫn đến hành vi không mong muốn.
Liên kết này có thể là một nguồn thông tin tốt về câu hỏi này.