HashMap
1. HashMap là gì?
Phần tiêu đề “1. HashMap là gì?”HashMap<K, V> lưu trữ dữ liệu theo từng cặp khóa (key) - giá trị (value), cho phép tra cứu giá trị cực nhanh nếu biết khóa:
import java.util.HashMap;import java.util.Map;
Map<String, Integer> ages = new HashMap<>();
ages.put("An", 20);ages.put("Bình", 22);ages.put("Chi", 19);
System.out.println(ages.get("An")); // 202. Các thao tác thường dùng
Phần tiêu đề “2. Các thao tác thường dùng”Map<String, Integer> ages = new HashMap<>();ages.put("An", 20);ages.put("Bình", 22);
ages.put("An", 21); // key đã tồn tại -> GHI ĐÈ giá trị cũ, không tạo cặp mớiSystem.out.println(ages.get("An")); // 21
System.out.println(ages.containsKey("Chi")); // falseSystem.out.println(ages.getOrDefault("Chi", 0)); // 0 - giá trị mặc định nếu key không tồn tạiSystem.out.println(ages.get("Chi")); // null nếu không tồn tại (KHÔNG ném lỗi)
ages.remove("Bình");System.out.println(ages.size()); // 1⚠️ get() với khóa không tồn tại trả về null, không ném exception - nếu code sau đó dùng kết quả như một int (thông qua unboxing), sẽ gây NullPointerException. Xem chi tiết ở trang “Autoboxing/Unboxing và NPE” trong mục What the Java!.
3. Duyệt HashMap
Phần tiêu đề “3. Duyệt HashMap”Map<String, Integer> ages = new HashMap<>();ages.put("An", 20);ages.put("Bình", 22);
// Duyệt qua từng cặp key-valuefor (Map.Entry<String, Integer> entry : ages.entrySet()) { System.out.println(entry.getKey() + " -> " + entry.getValue());}
// Chỉ duyệt khóafor (String name : ages.keySet()) { System.out.println(name);}
// Chỉ duyệt giá trịfor (int age : ages.values()) { System.out.println(age);}⚠️ HashMap không đảm bảo thứ tự các phần tử khi duyệt - thứ tự có thể khác với thứ tự thêm vào và có thể thay đổi. Nếu cần giữ thứ tự thêm vào, dùng LinkedHashMap; nếu cần thứ tự sắp xếp theo khóa, dùng TreeMap.
4. Khóa của HashMap
Phần tiêu đề “4. Khóa của HashMap”Khóa thường là kiểu bất biến như String, Integer. Nếu dùng đối tượng tự định nghĩa làm khóa, lớp đó cần override đúng equals() và hashCode() (xem trang “equals, hashCode và toString” trong phần OOP), nếu không HashMap sẽ không tìm đúng phần tử dù nội dung giống nhau.
Tổng kết
Phần tiêu đề “Tổng kết”HashMap<K, V>lưu cặp khóa-giá trị, tra cứu theo khóa rất nhanhput(),get(),containsKey(),getOrDefault(),remove()là các thao tác cơ bảnget()trả vềnullkhi khóa không tồn tại, không ném lỗi- Không đảm bảo thứ tự phần tử - dùng
LinkedHashMap/TreeMapnếu cần thứ tự