Trong Java, có nhiều cách để duyệt qua một đối tượng Map, từ việc sử dụng Iterator đến việc tận dụng các tính năng mới như vòng lặp for-each và biểu thức lambda trong JDK 8.
1. Sử dụng keySet() hoặc values()
Nếu chỉ cần lấy các khóa (keys) hoặc các giá trị (values) từ Map, phương pháp này rất tiện lợi:
import java.util.HashMap;
import java.util.Map;
public class DemoMap {
private static Map<String, Integer> map = new HashMap<>(16);
public void hienThiKeys() {
for (String key : map.keySet()) {
System.out.println(key);
}
}
public void hienThiValues() {
for (Integer value : map.values()) {
System.out.println(value);
}
}
}
2. Sử dụng keySet() và get(key)
Để lấy cả khóa và giá trị, có thể duyệt qua keySet() và sau đó gọi get(key) để lấy giá trị tương ứng. Tuy nhiên, phương pháp này không hiệu quả như sử dụng entrySet().
public void hienThiKeysVaValuesBangGet() {
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
}
3. Sử dụng entrySet()
Phương pháp này cho phép lấy cả khóa và giá trị trong mỗi lần duyệt, thường được sử dụng rộng rãi vì hiệu suất tốt hơn so với cách thứ hai.
public void hienThiKeysVaValuesBangEntrySet() {
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
4. Sử dụng Iterator
Khi cần xóa phần tử trong quá trình duyệt, Iterator là lựa chọn phù hợp:
import java.util.Iterator;
import java.util.Map;
public void hienThiVaXoaBangIterator() {
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
System.out.println(entry.getKey() + ": " + entry.getValue());
// Xóa phần tử
// iterator.remove();
}
}
5. Sử dụng Lambda Expression
Biểu thức lambda cung cấp cú pháp gọn gàng hơn, hỗ trợ duyệt qua cả khóa và giá trị. Tuy nhiên, hiệu suất của nó có thể thấp hơn so với entrySet().
public void hienThiBangLambda() {
map.forEach((k, v) -> System.out.println(k + ": " + v));
}
Lời Khuyên Khi Duyệt Map
- Sử dụng keySet() hoặc values() khi chỉ cần lấy khóa hoặc giá trị.
- Lựa chọn entrySet() khi cần lấy cả khóa và giá trị.
- Áp dụng Iterator khi cần xóa phần tử trong quá trình duyệt.
- Tạo một Map tạm thời nếu cần thêm phần tử vào Map đang duyệt.