Trong bài viết này, chúng ta sẽ cùng tìm hiểu về lớp HashMap trong Java và các thao tác khác nhau của nó cùng với sự trợ giúp của các ví dụ dẫn chứng.
Lớp HashMap
Lớp HashMap cung cấp chức năng của cấu trúc dữ liệu bảng băm. Nó lưu trữ các phần tử trong các cặp khóa và giá trị. Ở đây, các khóa là định danh duy nhất được sử dụng để liên kết từng giá trị trên Map. Lớp HashMap thực hiện triển khai cho Map Interface.
Tạo HashMap
Để tạo một Hashmap, trước tiên chúng ta phải thêm gói package java.util.HashMap. Sau khi thêm, chúng ta có thể tạo Hashmap như sau:
1 |
HashMap <K, V> sinh_vien = new HashMap<>(); |
Trong đoạn mã trên, chúng ta đã tạo một Hashmap có tên là sinh_vien. Ở đây, K đại diện cho kiểu khóa và V đại diện cho kiểu giá trị.
Ví dụ:
1 |
HashMap<String, Integer> sinh_vien = new HashMap<>(); |
Ở đây, khóa có kiểu là chuỗi ký tự và giá trị có kiểu là số nguyên.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 |
import java.util.HashMap; class Main { public static void main(String[] args) { HashMap<Integer, String> sinh_vien = new HashMap<>(); sinh_vien.put(12, "Sinh vien Y"); sinh_vien.put(13, "Sinh vien Luat"); sinh_vien.put(16, "Sinh vien Ky thuat"); System.out.println(sinh_vien); } } |
Kết quả:
1 |
{16=Sinh vien Ky thuat, 12=Sinh vien Y, 13=Sinh vien Luat} |
Trong ví dụ trên, chúng ta đã tạo một HashMap tên là sinh_vien. Ở đây, chúng ta đã sử dụng phương thức put() để thêm các phần tử vào Hashmap. Chúng ta sẽ tìm hiểu thêm về phương thức put() ở phần sau.
Các thao tác cơ bản trên HashMap
Lớp HashMap cung cấp nhiều phương thức khác nhau để thực hiện các thao tác khác nhau trên Hashmap. Chúng ta sẽ xem xét một số thao tác thường được sử dụng:
- Thêm các phần tử.
- Truy cập các phần tử.
- Thay đổi các phần tử.
- Loại bỏ các phần tử.
- Thêm các phần tử vào HashMap.
1. Thêm phần tử
Để thêm một phần tử vào Hashmap, chúng ta sử dụng phương thức put() của lớp HashMap.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 |
import java.util.HashMap; class Main { public static void main(String[] args) { HashMap<Integer, String> sinh_vien = new HashMap<>(); sinh_vien.put(12, "Sinh vien Y"); sinh_vien.put(13, "Sinh vien Luat"); sinh_vien.put(16, "Sinh vien Ky thuat"); System.out.println(sinh_vien); } } |
Kết quả:
1 |
{16=Sinh vien Ky thuat, 12=Sinh vien Y, 13=Sinh vien Luat} |
Trong ví dụ trên, chúng ta đã tạo một HashMap có tên là sinh_vien. Ở đây, chúng ta đã sử dụng phương thức put() để thêm các phần tử. Ta có câu lệnh sau:
1 |
sinh_vien.put(13, "Sinh vien Luat"); |
Ở đây, chúng ta đang truyền giá trị 13 làm khóa và giá trị kiểu chuỗi ký tự “Sinh vien Luat” làm giá trị cho phương thức put().
2. Truy cập phần tử
Chúng ta có thể sử dụng phương thức get() để truy cập giá trị từ hashmap.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import java.util.HashMap; class Main { public static void main(String[] args) { HashMap<Integer, String> sinh_vien = new HashMap<>(); sinh_vien.put(12, "Sinh vien Y"); sinh_vien.put(13, "Sinh vien Luat"); sinh_vien.put(16, "Sinh vien Ky thuat"); System.out.println(sinh_vien); String truong_hoc = sinh_vien.get(13); System.out.println(truong_hoc); } } |
Kết quả:
1 2 |
{16=Sinh vien Ky thuat, 12=Sinh vien Y, 13=Sinh vien Luat} Sinh vien Luat |
Trong câu lệnh:
1 |
String truong_hoc = sinh_vien.get(13); |
Ở đây, phương thức get() nhận giá trị khóa làm đối số của nó và trả về giá trị tương ứng được liên kết với khóa.
Chúng ta cũng có thể truy cập các khóa, giá trị và các cặp khóa và giá trị của Hashmap dưới dạng các khung nhìn bằng cách sử dụng các phương thức keySet(), values() và entrySet() tương ứng.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import java.util.HashMap; class Main { public static void main(String[] args) { HashMap<Integer, String> sinh_vien = new HashMap<>(); sinh_vien.put(12, "Sinh vien Y"); sinh_vien.put(13, "Sinh vien Luat"); sinh_vien.put(16, "Sinh vien Ky thuat"); System.out.println(sinh_vien); System.out.println("Khoa: " + sinh_vien.keySet()); System.out.println("Gia tri: " + sinh_vien.values()); System.out.println("Cap khoa/ gia tri: " + sinh_vien.entrySet()); } } |
Kết quả:
1 2 3 4 |
{16=Sinh vien Ky thuat, 12=Sinh vien Y, 13=Sinh vien Luat} Khoa: [16, 12, 13] Gia tri: [Sinh vien Ky thuat, Sinh vien Y, Sinh vien Luat] Cap khoa/ gia tri: [16=Sinh vien Ky thuat, 12=Sinh vien Y, 13=Sinh vien Luat] |
Trong ví dụ trên, chúng ta đã tạo một Hashmap có tên là sinh_vien. Ở đây, chúng ta đang truy cập các khóa, giá trị và các cặp khóa và giá trị từ Hashmap.
3. Thay đổi giá trị
Chúng ta có thể sử dụng phương thức replace() để thay đổi giá trị được liên kết với một khóa trong một Hashmap.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import java.util.HashMap; class Main { public static void main(String[] args) { HashMap<Integer, String> sinh_vien = new HashMap<>(); sinh_vien.put(12, "Sinh vien Y"); sinh_vien.put(13, "Sinh vien Luat"); sinh_vien.put(16, "Sinh vien Ky thuat"); System.out.println(sinh_vien); sinh_vien.replace(12, "Sinh vien Khoa hoc"); System.out.println(sinh_vien); } } |
Kết quả:
1 2 |
{16=Sinh vien Ky thuat, 12=Sinh vien Y, 13=Sinh vien Luat} {16=Sinh vien Ky thuat, 12=Sinh vien Khoa hoc, 13=Sinh vien Luat} |
Trong ví dụ trên, chúng ta đã tạo một Hashmap có tên là sinh_vien. Câu lệnh:
1 |
sinh_vien.replace(12, "Sinh vien Khoa hoc"); |
Ở đây, chúng ta đang thay đổi giá trị được tham chiếu bởi khóa 12 bằng giá trị mới là “Sinh vien Khoa hoc”.
Lớp HashMap cũng cung cấp một số biến thể của phương thức replace() như replaceAll().
4. Xóa các phần tử
Để xóa các phần tử khỏi một Hashmap, chúng ta có thể sử dụng phương thức remove().
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import java.util.HashMap; class Main { public static void main(String[] args) { HashMap<Integer, String> sinh_vien = new HashMap<>(); sinh_vien.put(12, "Sinh vien Y"); sinh_vien.put(13, "Sinh vien Luat"); sinh_vien.put(16, "Sinh vien Ky thuat"); System.out.println(sinh_vien); sinh_vien.replace(12, "Sinh vien Khoa hoc"); System.out.println(sinh_vien); String a = sinh_vien.remove(16); System.out.println(sinh_vien); } } |
Kết quả:
1 2 3 |
{16=Sinh vien Ky thuat, 12=Sinh vien Y, 13=Sinh vien Luat} {16=Sinh vien Ky thuat, 12=Sinh vien Khoa hoc, 13=Sinh vien Luat} {12=Sinh vien Khoa hoc, 13=Sinh vien Luat} |
Ở đây, phương thức remove() lấy khóa làm tham số của nó. Sau đó, nó trả về giá trị được liên kết với khóa và xóa phần tử.
Các phương thức khác của hashmap
Phương thức | Mô tả |
clear() | Xóa tất cả các tham chiếu. |
compute() | Tính giá trị mới cho khóa được xác định. |
computeIfAbsent() | Tính giá trị nếu tham chiếu của khóa không tồn tại. |
computeIfPresent() | Tính giá trị nếu tham chiếu của khóa tồn tại. |
merge() | Kết hợp tham chiếu được xác định vào Hashmap. |
clone() | Tạo một bản sao chép của Hashmap. |
containsKey() | Kiểm tra khóa có tồn tại trong Hashmap. |
containsValue() | Kiểm tra giá trị có tồn tại trong Hashmap. |
size() | Trả về số lượng phần tử trong Hashmap. |
isEmpty() | Kiểm tra xem Hashmap có rỗng hay không. |
Duyệt qua các phần tử của Hashmap
Để lặp qua từng mục của Hashmap, chúng ta có thể sử dụng vòng lặp For-each.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.HashMap; class Main { public static void main(String[] args) { HashMap<Integer, String> sinh_vien = new HashMap<>(); sinh_vien.put(12, "Sinh vien Y"); sinh_vien.put(13, "Sinh vien Luat"); sinh_vien.put(16, "Sinh vien Ky thuat"); System.out.print("Khoa: "); for (Integer i : sinh_vien.keySet()) { System.out.print(i); System.out.print("\t"); } System.out.print("\nGia tri:"); for (String j : sinh_vien.values()) { System.out.print(j); System.out.print("\t"); } } } |
Kết quả:
1 2 |
Khoa: 16 12 13 Gia tri:Sinh vien Ky thuat Sinh vien Y Sinh vien Luat |
Tạo HashMap từ các lớp Map khác
Trong Java, chúng ta cũng có thể tạo một Hashmap từ các lớp Map khác.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import java.util.HashMap; import java.util.TreeMap; class Main { public static void main(String[] args) { TreeMap<Integer, String> sinh_vien = new TreeMap<>(); sinh_vien.put(1, "Nguyen A"); sinh_vien.put(2, "Nguyen B"); HashMap<Integer, String> sinh_vien2 = new HashMap<>(sinh_vien); sinh_vien2.put(5, "Nguyen C"); System.out.println(sinh_vien2); } } |
Kết quả:
1 |
{1=Nguyen A, 5=Nguyen C, 2=Nguyen B} |
Trong ví dụ trên, chúng ta đã tạo một TreeMap có tên là sinh_vien. Câu lệnh:
1 |
HashMap<Integer, String> sinh_vien2 = new HashMap<>(sinh_vien); |
Ở đây, chúng ta đang tạo một HashMap số có tên là sinh_vien2 sử dụng TreeMap.
Chú ý: Trong khi tạo một Hashmap, chúng ta có thể bao gồm các thông số tùy chọn: kích thước và hệ số nạp đầy.
Ví dụ:
1 |
HashMap<K, V> so_thuc = new HashMap<>(9, 0.3f); |
Trong đó:
- 9: Điều này có nghĩa là nó có thể lưu trữ 9 mục khóa/ giá trị.
- 0,3f (hệ số nạp đầy là 0,3): Điều này có nghĩa là bất cứ khi nào bảng băm của chúng ta được lấp đầy 30%, các bản ghi được chuyển sang một bảng băm mới gấp đôi kích thước của bảng băm ban đầu. Nếu các tham số tùy chọn không được truyền vào, thì kích thước mặc định sẽ là 16 và hệ số tải mặc định sẽ là 0,75.
Trên đây là khái niệm và ví dụ cơ bản về lớp Hashmap trong Java. Hy vọng mọi người có thể áp dụng vào trong chương trình của mình. Mọi người hãy tiếp tục theo dõi các bài tiếp theo và cập nhật các bài mới nhất trên tek4 nhé!
P/s: Cảm ơn mọi người!