Tại sao giao diện Collection có equals(Object o)
và hashCode()
, cho rằng bất kỳ triển khai nào sẽ có những mặc định đó (được kế thừa từ Object
)?Tại sao giao diện Bộ sưu tập lại bằng() và hashCode()?
Trả lời
Trong khi giao diện
Collection
thêm không quy định trong hợp đồng nói chung choObject.equals
, lập trình viên thực hiện các giao diệnCollection
"trực tiếp" (nói cách khác, tạo ra một lớp mà làCollection
nhưng không phải làSet
hoặcList
) phải tập thể dục nếu họ chọn ghi đèObject.equals
. Không cần phải làm như vậy, và quá trình hành động đơn giản nhất là dựa vào triển khai của đối tượng, nhưng người triển khai có thể muốn thực hiện "so sánh giá trị " thay cho so sánh tham chiếu mặc định ". (CácList
vàSet
giao diện nhiệm vụ như vậy so sánh giá trị.)Hợp đồng chung cho
Object.equals
bang phương pháp mà bằng phải đối xứng (nói cách khác,a.equals(b)
khi và chỉ khib.equals(a)
). Hợp đồng choList.equals
vàSet.equals
tuyên bố rằng danh sách chỉ bằng các danh sách khác và đặt thành các nhóm khác. Do đó, phương thức tùy chỉnh cho lớp thu thập thực hiện không phải giao diệnList
cũng không phảiSet
phải trả về false khi bộ sưu tập này là so với bất kỳ danh sách hoặc bộ nào. (Theo logic đó, nó không thể viết một lớp mà thực hiện một cách chính xác cả Set và Danh mục giao diện.)
và
Trong khi giao diện Collection cho biết thêm không có quy định để vị tướng hợp đồng cho phương thức
Object.hashCode
, người lập trình nên lưu ý rằng bất kỳ lớp nào ghi đè phương thứcObject.equals
cũng phải ghi đè phương thứcObject.hashCode
để đáp ứng hợp đồng chung cho phương thứcObject.hashCode
. Cụ thể,c1.equals(c2)
ngụ ý rằngc1.hashCode()==c2.hashCode()
.
Để trả lời câu hỏi cụ thể của bạn: tại sao lại có những phương pháp này? Nó được thực hiện đơn giản để thuận tiện để có thể bao gồm Java Docs đưa ra gợi ý về những gì người thực hiện nên làm với các phương thức này (ví dụ: so sánh sự bình đẳng của các giá trị chứ không phải là các tham chiếu).
Khi bất kỳ lớp nào triển khai Giao diện, nó sẽ tiêm/chấp nhận hợp đồng/quy tắc được xác định bởi giao diện.
Equalable & Hashable là hai hợp đồng/quy tắc được cung cấp mặc định. Bởi có điều này Nó giả định rằng bằng và hashCode cho một lớp nhất định được thực hiện một cách chính xác cho lớp đó.
- 1. Tại sao trả lại giao diện bộ sưu tập thay vì loại bê tông?
- 2. Thừa kế trong giao diện bộ sưu tập java
- 3. Tại sao bằng và hashCode được xác định trong Object?
- 4. array_map trên bộ sưu tập có giao diện mảng?
- 5. Đi qua một bộ sưu tập giao diện
- 6. Tại sao ổi Multimap.values () trả về bộ sưu tập bằng phẳng thay vì tập hợp các bộ sưu tập?
- 7. Tại sao MongoDB có bộ sưu tập
- 8. Đối tượng JAXB - hashcode và bằng
- 9. Tại sao Google Bộ sưu tập không hỗ trợ MultiKeyMap như Bộ sưu tập Apache?
- 10. Giao diện bộ sưu tập Java 8 so với Java7: ví dụ tự giới thiệu
- 11. backbone.js lặp lại một bộ sưu tập
- 12. Chung Bộ sưu tập
- 13. Tại sao bộ khởi tạo bộ sưu tập về chuyển nhượng lại không được phép?
- 14. Sử dụng Tập hợp mẫu để nhóm các mục trong giao diện bộ sưu tập
- 15. Thẻ và bộ sưu tập
- 16. java: trả lại bộ sưu tập
- 17. Tại sao Bộ sưu tập.max() không trả lại giá trị tối đa thực tế cho Bộ sưu tập chuỗi?
- 18. Meteor template.rendered - Tại sao bộ sưu tập trống?
- 19. Tại sao giao diện tĩnh?
- 20. tế bào Wrong đếm để xem bộ sưu tập trong giao diện người dùng thử nghiệm
- 21. Tại sao nên sử dụng Giao diện, Đa thừa kế và Giao diện, Lợi ích của Giao diện?
- 22. Tại sao đặt lại bộ sưu tập backbone.js của tôi chỉ thêm 1 mô hình
- 23. Tại sao NodeList không mở rộng Bộ sưu tập hoặc Iterable?
- 24. Tại sao bộ sưu tập lại có giá trị thấp hơn nhiều so với số '' .count?
- 25. Tôi nên sử dụng giao diện bộ sưu tập nào trong .NET cho COM-interop?
- 26. hashCode và equals cho Collections.unmodifiableCollection()
- 27. Sắp xếp lại bộ sưu tập C#
- 28. Tại sao bộ sưu tập Java không cung cấp phương thức bản đồ thuận tiện?
- 29. Giao diện/Siêu lớp cho Bộ sưu tập/Thùng chứa trong c + +
- 30. Hibernate chèn các bản sao vào bộ sưu tập @OneToMany