2010-08-13 21 views
33

Khi LinkedHashMap.keySet() được gọi, thứ tự của Set được trả về có giống như thứ tự các phím được thêm vào không?LinkedHashMap của Java có duy trì thứ tự các khóa không?

+0

Đối với những người đến từ PHP, hãy để tôi giúp họ bằng cách chỉ ra rằng LinkedHashMap hoạt động rất giống một mảng PHP. –

Trả lời

44

Có.

Xem: LinkedHashMap:

danh sách liên kết này quy định lặp đặt hàng, đó là bình thường thứ tự trong đó phím đã được đưa vào bản đồ (chèn theo đơn đặt hàng).

và từ các tài liệu HashMap#keySet:

Tập [trả lại] được hỗ trợ bởi bản đồ, vì vậy thay đổi bản đồ được phản ánh trong tập, và ngược lại.

+2

@Tôi cảm ơn, tôi vẫn chưa tin rằng điều này là rõ ràng. Tại sao LinkedHashMap.keySet() không trả về một lớp con của Set với thứ tự cố định? – Armand

+4

Bởi vì nếu nó trả về một SortedSet, sau đó LinkedHashMap sẽ thêm yêu cầu rằng các khóa của nó là một loại thực hiện Comparable, hoặc một hàm so sánh được cung cấp. Đây không phải là yêu cầu của Bản đồ. Kiểm tra tài liệu SortedSet: http://download.oracle.com/javase/6/docs/api/java/util/SortedSet.html. Không có yêu cầu này cho phép ngay cả các phím không thực hiện Comparable được sử dụng trong LinkedHashMap, đó là trường hợp tổng quát hơn. Việc thực hiện LinkedHashMap thậm chí có thể trả về một SortedSet nếu các khóa của nó là Comparable, nhưng nó đơn giản là không cần thiết. –

+1

Tất nhiên, hợp đồng của LinkedHashMap nói rằng nó duy trì trật tự INSERTION, có thể không phải là thứ tự TỰ NHIÊN. Vì vậy, trong trường hợp đó, một SortedSet sẽ không làm việc ở tất cả --- các phím đơn giản sẽ không được sắp xếp theo cách đó. –

32

Yes. Trường hợp ngoại lệ là khi một khóa được chèn lại, nó sẽ xuất hiện theo thứ tự mà nó được chèn vào danh sách đầu tiên.

+4

+1 Chụp tốt trên trường hợp góc đó. –

+3

Trên thực tế, ngoại lệ là khi khóa được ** gắn lại **, không bị xóa và sử dụng lại.Trường hợp này là khi bạn gọi 'put (khóa, giá trị)' cho một khóa đã có trong bản đồ. (The javadoc giải thích điều này rõ ràng.) –

Các vấn đề liên quan