Bằng cách xem mã nguồn cho LinkedHashMaps từ Sun, tôi thấy rằng có một lớp riêng được gọi là KeyIterator, tôi muốn sử dụng nó. Làm thế nào tôi có thể truy cập?Làm thế nào để tôi nhận được một bộ chuyển đổi khóa cho LinkedHashMap?
Trả lời
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
.
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()
Đó 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()
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. –
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