2009-06-10 7 views

Trả lời

42

Bạn nhận được nó bằng cách gọi

myMap.keySet().iterator(); 

Bạn thậm chí không cần phải biết nó tồn tại; nó chỉ là một tạo phẩm của việc thực hiện. Đối với tất cả các bạn biết, họ có thể sử dụng khỉ bay để lặp lại các phím; miễn là chúng được lặp lại theo spec, nó không quan trọng làm thế nào họ làm điều đó.

Bằng cách này, bạn có biết rằng HashMap có một lớp riêng gọi là KeyIterator (như làm ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, IdentityHashMap, TreeMap, và WeakHashMap)?
Điều đó có tạo nên sự khác biệt về cách bạn lặp lại thông qua các phím của HashMap không?


Edit: Trong phản ứng để bình luận của bạn, hãy lưu ý rằng nếu bạn đang cố gắng để lặp qua tất cả các cặp giá trị khóa trong một Map, có một cách tốt hơn so với iterating trên các phím và gọi get cho mỗi người. Phương thức entrySet() nhận được Set của tất cả các cặp khóa-giá trị mà sau đó bạn có thể lặp lại. Vì vậy, thay vì viết:

for (Key key : myMap.keySet()) { 
    Value val = myMap.get(key); 
    ... 
} 

bạn nên viết:

for (Map.Entry<Key, Value> entry : myMap.entrySet()) { 
    doSomethingWithKey(entry.getKey()); 
    doSomethingWithValue(entry.getValue()); 
    ... 
} 

Bạn cũng có thể lặp qua các giá trị với values() nếu bạn muốn.

Lưu ý rằng kể từ khi keySet, entrySet, và values được định nghĩa trong Map interface, họ sẽ làm việc cho bất kỳ Map, không chỉ LinkedHashMap.

+1

Nó không xảy ra với tôi mà tôi có thể lặp qua LinkedHashMap cho đến khi tôi thấy lớp riêng tư bên trong. Cảm ơn vì câu trả lời. –

+0

Tôi không biết sử dụng là mục nhập() của. Nhưng, nó thực sự hữu ích ở hầu hết mọi nơi tôi sử dụng HashMap. Cảm ơn @Michael – sravanreddy001

3

Bạn không nên sử dụng bất kỳ thứ gì được xác định là một phần của việc triển khai bên trong LinkedHashMap (tức là trong mã nguồn nhưng không được định nghĩa trong API). Điều gì sẽ xảy ra nếu việc triển khai nội bộ thay đổi trong bản phát hành tiếp theo? Tất cả các mã của bạn sử dụng nó sẽ phá vỡ.

Bạn nên viết mã cho API và làm điều gì đó như

myMap.keySet().iterator() 
3

Đó là một lớp học riêng, vì vậy bạn không thể trực tiếp sử dụng nó.

private class KeyIterator extends LinkedHashIterator<K> { 

Ví dụ về nó được trả về khi bạn sử dụng Iterator bình thường.

myMap.keySet().iterator()