Java HashMap: Chìa Khóa Của Bạn Để Lưu Trữ và Truy Xuất Dữ Liệu Hiệu Quả

Giới Thiệu

Xin chào các bạn nhà lập trình Java mới! Hôm nay, chúng ta sẽ bắt đầu hành trình thú vị vào thế giới Java HashMap. Đừng để tên quá tò mò này làm bạn sợ. Hãy tưởng tượng HashMap như là một柜 hồ sơ siêu thông minh cho dữ liệu của bạn. Nó như có một trợ lý cá nhân có thể ngay lập tức tìm thấy bất kỳ piece of information nào bạn cần!

Java - HashMap

Khi tôi đầu tiên học về HashMap, tôi tưởng tượng chúng như là một thư viện ma thuật nơi sách (dữ liệu của chúng ta) có thể bay từ giá và vào tay chúng ta ngay khi chúng ta yêu cầu. Đó chính là điều mà HashMap làm, nhưng với dữ liệu máy tính thay vì sách. Cool, phải không?

Hãy bước vào và mở khóa bí mật của lớp Java mạnh mẽ này!

Khai Báo Lớp

Trong Java, lớp HashMap được khai báo như sau:

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

Ồ! Đó là một đoạn mã dài, phải không? Đừng lo lắng nếu nó trông như một chảo súp chữ cái ngay bây giờ. Hãy phân tích nó:

  • public class HashMap<K,V>: Điều này cho chúng ta biết HashMap là một lớp public (bất kỳ ai cũng có thể sử dụng) và nó sử dụng hai tham số kiểu, K cho kiểu khóa và V cho kiểu giá trị.
  • extends AbstractMap<K,V>: HashMap đang xây dựng trên một lớp khác có tên là AbstractMap.
  • implements Map<K,V>, Cloneable, Serializable: Những giao diện này mà HashMap thực hiện, mang lại cho nó nhiều quyền năng hơn!

Tham Số

Nhớ rồi phân tử thư viện ma thuật của chúng ta? Giờ, trong thư viện này, mỗi cuốn sách (giá trị) có một số gọi duy nhất (khóa). Trong các thuật ngữ HashMap:

  • K: Kiểu của các khóa được duy trì bởi bản đồ này
  • V: Kiểu của các giá trị được ánh xạ

Ví dụ, nếu bạn muốn lưu trữ tuổi của mọi người, bạn có thể sử dụng String cho các tên (khóa) và Integer cho các tuổi (giá trị).

Các Hàm Khởi Tạo Lớp

HashMap có bốn hàm khởi tạo khác nhau. Hãy tưởng tượng chúng là những cách khác nhau để xây dựng thư viện ma thuật của chúng ta:

  1. HashMap(): Tạo một HashMap trống với khả năng và hệ số tải mặc định.
  2. HashMap(int initialCapacity): Tạo một HashMap trống với khả năng ban đầu được chỉ định và hệ số tải mặc định.
  3. HashMap(int initialCapacity, float loadFactor): Tạo một HashMap trống với khả năng ban đầu và hệ số tải được chỉ định.
  4. HashMap(Map<? extends K, ? extends V> m): Tạo một HashMap mới với các ánh xạ tương tự như Map được chỉ định.

Đừng lo quá nhiều về khả năng và hệ số tải bây giờ. Chỉ cần biết rằng chúng ảnh hưởng đến cách hiệu quả HashMap hoạt động ở phía sau màn hình.

Các Phương Thức Lớp

Bây giờ, hãy xem những điều kỳ diệu mà HashMap của chúng ta có thể làm. Tôi sẽ chỉ cho bạn một số phương thức thường được sử dụng:

Phương Thức Mô Tả
put(K key, V value) Thêm một cặp khóa-giá trị vào bản đồ
get(Object key) Truy xuất giá trị liên kết với khóa được chỉ định
remove(Object key) Xóa ánh xạ cho khóa được chỉ định
clear() Xóa tất cả các ánh xạ khỏi bản đồ
size() Trả về số lượng các ánh xạ khóa-giá trị trong bản đồ
isEmpty() Trả về true nếu bản đồ không chứa các ánh xạ
containsKey(Object key) Trả về true nếu bản đồ chứa khóa được chỉ định
containsValue(Object value) Trả về true nếu bản đồ chứa giá trị được chỉ định

Các Phương Thức Kế Thừa

HashMap cũng kế thừa các phương thức từ các lớp và giao diện cha mẹ của nó. Nó như thư viện ma thuật của chúng ta kế thừa một số kỹ năng từ các thư viện cũ hơn và thông thái hơn! Dưới đây là một số ví dụ:

  • Từ java.util.AbstractMap: equals(), hashCode(), toString()
  • Từ java.util.Map: putAll(), entrySet(), keySet(), values()

Ví Dụ

Hãy đặt kiến thức mới của chúng ta vào thực hành với một ví dụ đơn giản. Chúng ta sẽ tạo một HashMap để lưu trữ tuổi của một số nhà khoa học nổi tiếng:

import java.util.HashMap;

public class ScientistAges {
public static void main(String[] args) {
// Tạo một HashMap mới
HashMap<String, Integer> scientistAges = new HashMap<>();

// Thêm một số cặp khóa-giá trị
scientistAges.put("Albert Einstein", 76);
scientistAges.put("Isaac Newton", 84);
scientistAges.put("Marie Curie", 66);

// Truy xuất và in ra một giá trị
System.out.println("Tuổi của Albert Einstein: " + scientistAges.get("Albert Einstein"));

// Kiểm tra xem khóa có tồn tại hay không
if (scientistAges.containsKey("Stephen Hawking")) {
System.out.println("Chúng ta có tuổi của Stephen Hawking.");
} else {
System.out.println("Chúng ta không có tuổi của Stephen Hawking.");
}

// In ra số lượng của HashMap
System.out.println("Số lượng nhà khoa học: " + scientistAges.size());

// Xóa một cặp khóa-giá trị
scientistAges.remove("Isaac Newton");

// In ra tất cả các cặp khóa-giá trị
for (String name : scientistAges.keySet()) {
System.out.println(name + " sống đến được " + scientistAges.get(name) + " tuổi.");
}
}
}

Đầu Ra

Khi chúng ta chạy mã này, chúng ta sẽ thấy:

Tuổi của Albert Einstein: 76
Chúng ta không có tuổi của Stephen Hawking.
Số lượng nhà khoa học: 3
Albert Einstein sống đến được 76 tuổi.
Marie Curie sống đến được 66 tuổi.

Hãy phân tích lại điều gì đã xảy ra:

  1. Chúng ta đã tạo một HashMap mới có tên là scientistAges.
  2. Chúng ta đã thêm ba cặp khóa-giá trị: tên các nhà khoa học và tuổi của họ.
  3. Chúng ta đã truy xuất tuổi của Einstein bằng cách sử dụng phương thức get().
  4. Chúng ta đã kiểm tra xem chúng ta có tuổi của Hawking hay không bằng cách sử dụng containsKey(). Chúng ta không có, vì vậy nó in ra thông báo "không có".
  5. Chúng ta đã in ra số lượng nhà khoa học trong bản đồ của chúng ta bằng cách sử dụng size().
  6. Chúng ta đã xóa Newton khỏi bản đồ bằng cách sử dụng remove().
  7. Cuối cùng, chúng ta đã sử dụng vòng lặp for-each để duyệt qua tất cả các cặp khóa-giá trị còn lại và in chúng ra.

Và đó là thế! Bạn đã bước ra đầu tiên vào thế giới của Java HashMap. Nhớ rằng, luyện tập là chìa khóa. Hãy thử tạo các HashMap của riêng bạn với các loại dữ liệu khác nhau. Có thể là tạo một bản đồ của các cuốn sách yêu thích của bạn và các tác giả, hoặc các bạn bè và số điện thoại của họ.

HashMap rất hữu ích trong lập trình thực tế. Chúng giống như một chiếcdao kiếm Thụy Sĩ của cấu trúc dữ liệu – linh hoạt, hiệu quả và luôn có sẵn. Tiếp tục khám phá, tiếp tục lập trình, và trước khi bạn biết, bạn sẽ trở thành một chiến binh HashMap!

Credits: Image by storyset