Bỏ qua để đến nội dung

HashMap

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")); // 20
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ới
System.out.println(ages.get("An")); // 21
System.out.println(ages.containsKey("Chi")); // false
System.out.println(ages.getOrDefault("Chi", 0)); // 0 - giá trị mặc định nếu key không tồn tại
System.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!.

Map<String, Integer> ages = new HashMap<>();
ages.put("An", 20);
ages.put("Bình", 22);
// Duyệt qua từng cặp key-value
for (Map.Entry<String, Integer> entry : ages.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
// Chỉ duyệt khóa
for (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.

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()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.

  • HashMap<K, V> lưu cặp khóa-giá trị, tra cứu theo khóa rất nhanh
  • put(), get(), containsKey(), getOrDefault(), remove() là các thao tác cơ bản
  • get() trả về null khi 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/TreeMap nếu cần thứ tự