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 TreeSet
và HashSet
vấ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àTreeSet
sẽ 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 compareTo
sẽ 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, equals
sẽ 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 equals
hàm có nghĩa sai, không nói nghĩa sai.)
Xin lưu ý sự thống nhất này giữa equals
và compareTo
là tùy chọn, nhưng rất khuyến khích. Nếu không, hợp đồng giao diện Set
bị 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.