2012-03-06 22 views
6

thể trùng lặp:
Is the order guaranteed for the return of keySet() of a LinkedHashMap object?Hành vi của keySet LinkedHashMap của() và giá trị() phương pháp

Cân nhắc tôi tạo ra một LinkedHashMap, như sau:

Map<String, String> map = new LinkedHashMap<String, String>(); 
map.put("a", "aa"); 
map.put("b", "bb"); 
map.put("c", "cc"); 

Khi Tôi gọi keySet(), điều đó có cho tôi một bộ đặt hàng không? Và nếu tôi gọi values(), chúng cũng được đặt hàng?

EDIT

Sry, nghĩa là ra lệnh, không được sắp xếp.

+1

Đây không phải là hợp đồng được viết trong [Java Doc] (http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html#keySet%28%29). Tất cả nó đảm bảo là một giao diện Set. – Nishant

+3

Tại sao không [Sử dụng Nguồn, Lu-ca] (http://javasourcecode.org/html/open-source/jdk/jdk-6u23/java.util/LinkedHashMap.java.html)? – DNA

+0

@DNA liên kết bạn cung cấp hiện đã bị hỏng: ( – GreenGiant

Trả lời

8

Trước hết là LinkedHashMapđã đặt hàng nhưng không được được sắp xếp. TreeMapđược sắp xếp (và do đó cũng đã đặt hàng).

Điều đó đang được nói bạn không thể mong đợi đầu ra của keySet()values() để được sắp xếp. Trên thực tế, JavaDoc nói không có gì về thứ tự (khi nó quay ra, thứ tự được đảm bảo bởi JavaDoc: Is the order guaranteed for the return of keys and values from a LinkedHashMap object?) của các bộ sưu tập này, tuy nhiên xem xét việc triển khai chúng phải theo thứ tự cơ bản Map.

Để giải quyết chỉnh sửa gần đây cho câu hỏi của bạn: nó không phải là một phần của hợp đồng, trên thực tế LinkedHashMap thậm chí không thực hiện keySet()values() nhưng sử dụng của các lớp cơ sở (HashMap) phiên bản. Mặc dù dựa trên việc thực hiện, bạn có thể thấy thứ tự được giữ nguyên, bạn không nên phụ thuộc vào nó nếu bạn muốn ứng dụng của bạn được di chuyển.

+1

Vui lòng xem câu trả lời được chấp nhận của câu hỏi này: http://stackoverflow.com/questions/2923856/is-the-order-guaranteed-for-the-return-of-keyset-of-a-linkedhashmap-object –

+0

@ ArneEvertsson: 1, cảm ơn, đã sửa lại câu trả lời của tôi. Trong thực tế, tôi đánh dấu câu hỏi này là trùng lặp. –

2

Bạn không nhận được SortedSet hoặc bộ sưu tập được sắp xếp khi truy xuất tập hợp khóa hoặc giá trị. Tuy nhiên, các triển khai trả lại sử dụng các trình vòng lặp khóa/giá trị của bản đồ và do đó sẽ trả về các giá trị theo thứ tự chèn, ví dụ: khi được sử dụng trong vòng lặp foreach.

Vì vậy, bạn nhận được thứ tự như được xác định bởi LinkedHashMap nhưng bạn không nhất thiết có thể xem xét việc sắp xếp (và bạn cũng không thể sử dụng các bộ sưu tập đó).

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