Lưu Trữ Cặp Dữ Liệu Key-Value Cực Kỳ Nhanh Với HashMap

Ở bài viết trước, chúng ta đã làm quen với ArrayList – giải pháp thay thế tuyệt vời cho mảng cố định. Tuy nhiên, khi muốn tìm kiếm một phần tử trong ArrayList, chương trình phải duyệt qua từng vị trí. Đối với các bài toán tra cứu như "tìm thông tin sinh viên theo mã SV" hay "tra từ điển", việc dùng ArrayList sẽ tốn nhiều thời gian. Đó là lý do HashMap ra đời, giúp lưu trữ dữ liệu dạng cặp Key-Value với khả năng tra cứu cực kỳ nhanh chóng.

Lưu Trữ Cặp Dữ Liệu Key-Value Cực Kỳ Nhanh Với HashMap Trong Java
Ảnh minh họa: Tìm hiểu về lớp HashMap trong Java: Các hoạt động và cách dùng

1. HashMap Là Gì Và Hoạt Động Như Thế Nào?

HashMap là một lớp nằm trong gói java.util, triển khai interface Map thuộc Java Collections Framework. Cấu trúc này lưu trữ dữ liệu dưới dạng các cặp Key-Value (Khóa - Giá trị):

  • Key (Khóa): Duy nhất, dùng để định danh cho dữ liệu. Nếu bạn thêm một key đã tồn tại, giá trị (value) cũ sẽ bị ghi đè.
  • Value (Giá trị): Dữ liệu tương ứng gắn liền với Key. Khác với Key, Value có thể trùng lặp.

Về nguyên lý, HashMap hoạt động dựa trên kỹ thuật băm (hashing). Nó sử dụng phương thức hashCode() của Key để tính toán giá trị băm (hash value) và xác định vị trí lưu trữ (bucket) của phần tử. Nhờ đó, việc tìm kiếm hay truy xuất một giá trị theo Key diễn ra gần như tức thì mà không cần duyệt toàn bộ danh sách.

Lưu ý quan trọng: HashMap không bảo toàn thứ tự chèn của các phần tử và không đồng bộ (non-synchronized), thích hợp cho xử lý đơn luồng để tối ưu hiệu năng.

2. Cú Pháp Khai Báo HashMap

Do HashMap lưu trữ hai thành phần (Key và Value), chúng ta cần chỉ định kiểu dữ liệu đối tượng (Wrapper Class) cho cả hai khi khai báo. Cú pháp cơ bản như sau:

import java.util.HashMap;

// Khai báo HashMap với Key là String và Value là String
HashMap<String, String> dictionary = new HashMap<>();

// Khai báo HashMap với Key là String và Value là Integer
HashMap<String, Integer> studentScores = new HashMap<>();

3. Các Thao Tác Cơ Bản Với HashMap

Thêm dữ liệu với put()

Phương thức put(key, value) được sử dụng để thêm một cặp key-value mới hoặc cập nhật lại giá trị nếu key đã tồn tại.

HashMap<String, String> phoneBook = new HashMap<>();

// Thêm các phần tử
phoneBook.put("Alice", "0901234567");
phoneBook.put("Bob", "0912345678");
phoneBook.put("Charlie", "0923456789");

// Ghi đè số điện thoại của Alice
phoneBook.put("Alice", "0999999999");

Truy xuất dữ liệu với get()

Để lấy giá trị tương ứng với một key, ta dùng phương thức get(key). Nếu key không tồn tại trong HashMap, hàm sẽ trả về null.

String aliceNumber = phoneBook.get("Alice");
System.out.println("Số điện thoại của Alice: " + aliceNumber); // Output: 0999999999

String davidNumber = phoneBook.get("David");
System.out.println("Số điện thoại của David: " + davidNumber); // Output: null

Xóa phần tử và kiểm tra sự tồn tại

  • remove(key): Xóa cặp key-value ra khỏi HashMap dựa trên key truyền vào.
  • containsKey(key): Kiểm tra xem key có tồn tại trong Map hay không (trả về boolean).
  • containsValue(value): Kiểm tra xem value có tồn tại trong Map hay không.
  • size(): Trả về số lượng cặp key-value hiện có.
  • clear(): Xóa toàn bộ các phần tử trong HashMap.

4. Duyệt Qua Các Phần Tử Trong HashMap

Để duyệt qua toàn bộ dữ liệu trong HashMap, bạn có thể duyệt qua danh sách các Key thông qua phương thức keySet(), hoặc duyệt qua từng cặp Key-Value sử dụng entrySet().

HashMap<String, Integer> items = new HashMap<>();
items.put("Táo", 15000);
items.put("Cam", 20000);
items.put("Xoài", 25000);

// Cách 1: Duyệt qua các Key
System.out.println("--- Danh sách mặt hàng (duyệt keySet) ---");
for (String key : items.keySet()) {
    System.out.println(key + " : " + items.get(key) + " VNĐ");
}

// Cách 2: Duyệt qua Entry (Key-Value)
System.out.println("--- Danh sách mặt hàng (duyệt entrySet) ---");
for (HashMap.Entry<String, Integer> entry : items.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue() + " VNĐ");
}

5. Khi Nào Nên Sử Dụng HashMap?

HashMap là lựa chọn tuyệt vời trong các trường hợp:

  • Bạn cần quản lý dữ liệu dưới dạng mối quan hệ 1-1 (Ví dụ: Mã sinh viên - Đối tượng Sinh viên, Từ tiếng Anh - Nghĩa tiếng Việt).
  • Bài toán yêu cầu tra cứu, tìm kiếm dữ liệu nhanh chóng dựa trên mã định danh.
  • Thứ tự xuất hiện của các phần tử không quan trọng trong ứng dụng của bạn.

Lời Kết

HashMap là một trong những cấu trúc dữ liệu mạnh mẽ và được ứng dụng rất nhiều trong lập trình Java thực tế nhờ tốc độ xử lý vượt trội. Việc nắm vững cách quản lý cặp Key-Value sẽ giúp bạn giải quyết các bài toán tra cứu vô cùng dễ dàng. Ở bài viết tiếp theo, chúng ta sẽ học cách lưu trữ dữ liệu lâu dài vào ổ cứng thông qua thao tác Đọc và Ghi File trong Java.


Nguồn tham khảo


📚 Chuỗi bài: Lộ Trình Tự Học Java Từ Con Số 0 Đến Ứng Dụng Thực Tế

Chuỗi 20 bài viết thiết kế dạng 'cầm tay chỉ việc' dành riêng cho người mới bắt đầu học lập trình Java. Lộ trình đi từ tư duy nền tảng, cú pháp cơ bản, lập trình hướng đối tượng (OOP) cho đến hoàn thiện một dự án thực tế nhỏ.

  1. 1. Java Là Giống Gì? Cài Đặt Environment (JDK & IntelliJ IDEA) Cực Nhanh
  2. 2. Giải Mã Chương Trình 'Hello World' Và Cấu Trúc Cơ Bản Của Bài Code Java
  3. 3. Biến Và Kiểu Dữ Liệu Trong Java: Cách Lưu Trữ Thông Tin Đúng Chuẩn
  4. 4. Toán Tử Trong Java: Hướng Dẫn Tính Toán Và So Sánh Chi Tiết
  5. 5. Nhập Xuất Dữ Liệu Với Scanner: Làm Cho Chương Trình Biết Tương Tác
  6. 6. Cấu Trúc Điều Kiện If-Else Và Switch-Case: Dạy Máy Tính Rẽ Nhánh Tư Duy
  7. 7. Vòng Lặp For, While Và Do-While Trong Java: Tự Động Hóa Công Việc Lặp Lại
  8. 8. Phương Thức (Method) Trong Java: Tái Sử Dụng Code Một Cách Thông Minh
  9. 9. Mảng Một Chiều (Array) Trong Java: Quản Lý Danh Sách Dữ Liệu Đơn Giản
  10. 10. Bài 10: Xử Lý Chuỗi Dữ Liệu Với String Và StringBuilder Trong Java
  11. 11. Lập Trình Hướng Đối Tượng (OOP): Lớp (Class) Và Đối Tượng (Object) Là Đâu?
  12. 12. Tính Đóng Gói (Encapsulation) Và Access Modifiers: Bảo Vệ Dữ Liệu Safe 100%
  13. 13. Tính Kế Thừa (Inheritance): Tái Sử Dụng Mã Nguồn Với Từ Khóa Extends
  14. 14. Tính Đa Hình (Polymorphism): Nạp Chồng (Overloading) Và Ghi Đè (Overriding)
  15. 15. Lộ Trình Tự Học Java: Tính Trừu Tượng (Abstraction) - Abstract Class Hay Interface?
  16. 16. Xử Lý Ngoại Lệ (Exception Handling): Giúp Chương Trình Không Bị 'Sập' Đột Ngột
  17. 17. Java Collections Framework: Làm Quen Mảng Cố Định Với ArrayList
  18. 18. Lưu Trữ Cặp Dữ Liệu Key-Value Cực Kỳ Nhanh Với HashMap ← Bạn đang đọc
  19. 19. Đọc Và Ghi File Trong Java: Lưu Trữ Dữ Liệu Lâu Dài Vào Ổ Cứng
  20. 20. Dự Án Thực Tế: Xây Dựng Ứng Dụng Quản Lý Sinh Viên Console Hoàn Chỉnh

← Bài trước: Java Collections Framework: Làm Quen Mảng Cố Định Với ArrayList Bài tiếp theo: Đọc Và Ghi File Trong Java: Lưu Trữ Dữ Liệu Lâu Dài Vào Ổ Cứng →

Nhận xét