Trong Iterator
Mặt trời đã thêm phương thức xóa để xóa phần tử được truy cập lần cuối của bộ sưu tập. Tại sao không có phương thức thêm để thêm phần tử mới vào bộ sưu tập? Những loại tác dụng phụ nào có thể có đối với bộ sưu tập hoặc vòng lặp?lý do tại sao không có phương thức thêm trong giao diện Iterator
Trả lời
Mục đích duy nhất của Iterator là liệt kê thông qua bộ sưu tập. Tất cả các bộ sưu tập đều chứa phương thức add()
để phục vụ mục đích của bạn. Sẽ không có điểm khi thêm vào một Iterator vì bộ sưu tập có thể hoặc không thể được đặt hàng (trong trường hợp của HashSet
).
EDIT: Trong khi làm việc trên một vấn đề khác, tôi đưa ra một lý do khác là Iterator
thiếu phương thức add()
. Nhìn dưới mui xe của ArrayList
(dòng 111), và HashMap
(dòng 149), chúng ta thấy rằng việc thực hiện chỉ là một vài phương pháp xung quanh một mảng các đối tượng. Bây giờ chúng ta xem xét cách mảng được xử lý trong bộ nhớ.
Đây là một mảng gồm 5 phần tử. Tuy nhiên, có sáu chỉ số. Chữ "a" trong mảng này được liệt kê là phần tử 0 vì để đọc nó, từ trái sang phải giống như máy tính, bạn phải bắt đầu từ chỉ mục 0. Bây giờ, nếu chúng ta lặp qua mảng này (có, bộ sưu tập, nhưng nó sẽ chuyển thành một mảng), chúng ta sẽ bắt đầu từ chỉ số 0 và tiếp tục chỉ mục 1. Tại thời điểm này trong Iterator, chúng ta muốn gọi add("f");
. Tại thời điểm này, hãy so sánh ý nghĩa của add()
và remove()
. remove()
sẽ để lại một khoảng trống trong mảng, dễ nhảy qua, bởi vì chúng ta có thể ngay lập tức nhận ra rằng nó không phải là một thành viên. Mặt khác, add()
sẽ đặt một yếu tố mới mà trước đây không có. Điều này sẽ ảnh hưởng đến độ dài của mảng mà chúng tôi đang lặp qua. Điều gì sẽ xảy ra khi chúng ta đến được phần tử cuối cùng đó? Thậm chí chúng tôi có thể đảm bảo rằng nó có (có nghĩa là mảng đó không vượt quá the maximum size)?
Tất cả trong tất cả, các đối số theo cách này hay cách khác đều có điểm hợp lệ, nhưng dòng dưới cùng là hành vi của phương pháp add()
không được xác định rõ trong mọi trường hợp. Sun đã phải lựa chọn nơi để hạn chế chức năng, và họ đã chọn không bao gồm phương pháp này.
"bởi vì bộ sưu tập có thể hoặc không thể được đặt hàng" - bạn có thể xây dựng nó một chút không. Cảm ơn – droidsites
Tôi đã nhận được tuyên bố của bạn :-). Cảm ơn – droidsites
Một HashSet không bảo đảm cho thứ tự các thành viên của nó. Nếu bạn đang lặp qua nó để cố gắng tìm một điểm mà tại đó để chèn một giá trị, bạn vừa đánh bại điểm của một Iterator. – gobernador
Tôi không thể nghĩ ra bất kỳ lý do lý thuyết nào tại sao add()
không thể được bao gồm trong Iterator
. Cũng giống như Iterator
có thể cho phép các thành phần bị xóa khỏi bộ sưu tập thông qua chính nó, nó có thể được thiết kế để xử lý các phần tử được thêm vào theo cùng một cách.
Nhưng tôi sẽ nói rằng trong tất cả các năm lập trình của tôi trong Java - trên 15! - Tôi chưa bao giờ muốn có phương thức Iterator.add()
. Vì vậy, tôi nghi ngờ nó chỉ đơn giản là không phải tất cả những gì hữu ích.
Nếu bạn đang làm việc trên danh sách, bạn có thể sử dụng ListIterator cung cấp cả thao tác thêm và xóa.
Không trả lời câu hỏi này. Nhưng có, 'Iterator' không thực hiện' add' bởi vì nó không phải 'ListIterator'. – Robert
Được rồi, ở đây chúng tôi đi:
Câu trả lời được nêu rõ trong faq thiết kế:
Tại sao bạn không cung cấp một phương pháp Iterator.add?
Ngữ nghĩa không rõ ràng, với điều kiện hợp đồng cho Iterator không đảm bảo về thứ tự lặp lại. Tuy nhiên, lưu ý rằng ListIterator cung cấp một hoạt động bổ sung, vì nó đảm bảo thứ tự của phép lặp.
http://docs.oracle.com/javase/1.4.2/docs/guide/collections/designfaq.html#10
Iterator chỉ trỏ đến phần tử tiếp theo. nơi ListIterator có con trỏ đến phần tử trước đó (nhớ, nó có thể đi ngược).
- 1. Java: Lý do của giao diện Cloneable
- 2. Tại sao có thể gọi phương thức trên phương thức giao diện Java? [So sánh]
- 3. Tại sao không có giao diện "Iterable" trong STL?
- 4. Tại sao #clone() không có trong giao diện Cloneable?
- 5. Tại sao phương thức đồng bộ không được bao gồm trong giao diện
- 6. Giao diện có phương thức toString không?
- 7. Trong GWT, tại sao một phương thức không trả về một giao diện?
- 8. Phương thức giao diện Java Phương pháp: Mỗi lớp có thực hiện một giao diện không?
- 9. Tại sao các phương thức giao diện C# không được khai báo trừu tượng hoặc ảo?
- 10. Tại sao Iterator có phương thức chứa nhưng Iterable thì không, trong Scala 2.8?
- 11. Lý do tôi nhận được "Phương thức không trừu tượng, không phải .cctor trong giao diện" là gì?
- 12. lý do tại sao phương thức save_model không hoạt động trong admin.StackedInline?
- 13. phương pháp tĩnh không thể triển khai phương thức giao diện, tại sao?
- 14. lý do tại sao không có phương pháp Vứt bỏ trên HttpWebResponse
- 15. Tại sao một phương thức bắt đầu bằng tên giao diện không biên dịch trong C#?
- 16. Tại sao không có giao diện cuối cùng trong Java?
- 17. Thêm phương thức bổ sung vào giao diện
- 18. Giao diện PHP IteratorAggregate vs Iterator?
- 19. Tại sao phương thức giao diện C# được triển khai trong một lớp là công khai?
- 20. Tại sao chúng ta nên khai báo các phương thức giao diện là công khai?
- 21. thực hiện giao diện với phương thức riêng trong vb.net
- 22. Phương thức khởi tạo trong giao diện
- 23. Tại sao AlertDialog.Builder không có phương thức setOnDismissListener hoặc setOnShowListener?
- 24. Tại sao có một trình lặp phương thức() trên java.util.Collection
- 25. Tại sao giao diện không [Serializable]?
- 26. lý do tại sao() không hoạt động?
- 27. lý do tại sao tạo các phương pháp không có đặc quyền?
- 28. Hãy giải thích lý do tại sao tôi có thể khởi tạo giao diện "Ứng dụng" trong Excel VSTO
- 29. Lý do cho hạn chế chuỗi giao diện .NET UI
- 30. Tại sao Eclipse phàn nàn về @Override trên các phương thức giao diện?
Tôi nghĩ rằng bạn có một sự trùng lặp: http://stackoverflow.com/questions/993025/java-adding-elements-to-a-collection-during-iteration – mihaisimi
@mihaisimi - không có, đây là thực sự là một câu hỏi khác. –
Có, bạn đã đúng. Vẫn coobird cung cấp một câu trả lời tốt cho điều này trên chủ đề đó. – mihaisimi