HashMap trong Java là gì?
HashMap trong Java là một bảng băm dựa trên việc thực hiện Java's Map interface. Map là một tập hợp các cặp key-value. Nó ánh xạ các key tới các value.

Nói đơn giản hơn thì HashMap về cơ bản chỉ định các unique key cho các value tương ứng có thể được truy xuất tại bất kỳ điểm nào.
Những điểm quan trọng về lớp HashMap trong java:
HashMaplưu trữ dữ liệu dưới dạng cặpkeyvàvalue.HashMapchỉ chứa cáckeyduy nhất.HashMapcó thể có 1 key lànullvà nhiều giá trịnull.HashMapduy trì các phần tử KHÔNG theo thứ tự chèn.
Tạo một HashMap trong Java
Để tạo HashMap, trước tiên chúng ta phải import gói java.util.HashMap. Khi chúng ta đã import xong, sau đây là cách chúng ta có thể tạo các hashmap trong Java.
java
// HashMap creation with 8 capacity and 0.6 load factor
HashMap<Key, Value> numbers = new HashMap<>(8, 0.6f);
Trong đoạn code trên, chúng ta đã tạo ra một hashmap có tên là numbers. Ở đây:
Keylà code định danh duy nhất được sử dụng để liên kết từng phần tử (value) trong mapValuelà các phần tử được liên kết bởi các key trong map
Lưu ý về đoạn code new HashMap<>(8, 0.6). Ở đây, tham số đầu tiên là capacity và tham số thứ hai là loadFactor .
capacity– Dung lượng củaHashMapnày là8. Ý nghĩa: nó có thể lưu trữ 8 mục.loadFactor– Hệ số tải củahashmapnày là0,6. Đ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 đầy60%, các mục mới sẽ được chuyển sang bảng băm mới có kích thước gấp đôi bảng băm ban đầu.
Tạo HashMap từ các Map khác
Sau đây là cách chúng ta có thể tạo một hashmap chứa tất cả các phần tử của các map khác.
java
import java.util.HashMap;
class Main {
public static void main(String[] args) {
// Creating a hashmap of even numbers
HashMap<String, Integer> evenNumbers = new HashMap<>();
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
System.out.println("HashMap1: " + evenNumbers);
// Creating a hash map from other hashmap
HashMap<String, Integer> numbers = new HashMap<>(evenNumbers);
numbers.put("Three", 3);
System.out.println("HashMap2: " + numbers);
}
}
Kết quả
HashMap1: {Four=4, Two=2}
HashMap2: {Two=2, Three=3, Four=4}
Chèn các phần tử vào HashMap trong Java
put()– chèn cặpkey/valueđược chỉ định vào mapputAll()– chèn tất cả các mục từ map được chỉ định vào map hiện tạiputIfAbsent()– chèn cặpkey/valueđược chỉ định vào map nếukeyđược chỉ định không có trong map
java
import java.util.HashMap;
class Main {
public static void main(String[] args) {
// Creating HashMap of even numbers
HashMap<String, Integer> evenNumbers = new HashMap<>();
// Using put()
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
// Using putIfAbsent()
evenNumbers.putIfAbsent("Six", 6);
System.out.println("HashMap of even numbers: " + evenNumbers);
//Creating HashMap of numbers
HashMap<String, Integer> numbers = new HashMap<>();
numbers.put("One", 1);
// Using putAll()
numbers.putAll(evenNumbers);
System.out.println("HashMap of numbers: " + numbers);
}
}
Kết quả
HashMap of even numbers: {Six=6, Four=4, Two=2}
HashMap of numbers: {Six=6, One=1, Four=4, Two=2}
Duyệt qua các phần tử trong HashMap
entrySet()– trả về một tập hợp gồm tất cả cặpkey/valuecủa mapkeySet()– trả về một tập hợp gồm tất cả cáckeycủa mapvalues()– trả về một tập hợp gồm tất cả cácvaluecủa map
java
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> numbers = new HashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("HashMap: " + numbers);
// Using entrySet()
System.out.println("Key/Value mappings: " + numbers.entrySet());
// Using keySet()
System.out.println("Keys: " + numbers.keySet());
// Using values()
System.out.println("Values: " + numbers.values());
}
}
Kết quả
HashMap: {One=1, Two=2, Three=3}
Key/Value mappings: [One=1, Two=2, Three=3]
Keys: [One, Two, Three]
Values: [1, 2, 3]
get()- Trả vềvalueliên kết với key được chỉ định. Trả vềnullnếu không tìm thấy key.getOrDefault()- Trả về value liên kết với key được chỉ định. Trả vềvaluemặc định đã chỉ định nếu không tìm thấykey.
java
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> numbers = new HashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("HashMap: " + numbers);
// Using get()
int value1 = numbers.get("Three");
System.out.println("Returned Number: " + value1);
// Using getOrDefault()
int value2 = numbers.getOrDefault("Five", 5);
System.out.println("Returned Number: " + value2);
}
}
Kết quả
HashMap: {One=1, Two=2, Three=3}
Returned Number: 3
Returned Number: 5
Loại bỏ các phần tử trong HashMap
remove(key)– trả về và xóa mục liên kết với key được chỉ định khỏi mapremove(key, value)– chỉ xóa mục khỏi map nếu key được chỉ định liên kết vớivalueđã chỉ định và trả về giá trịboolean
java
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> numbers = new HashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("HashMap: " + numbers);
// remove method with single parameter
int value = numbers.remove("Two");
System.out.println("Removed value: " + value);
// remove method with two parameters
boolean result = numbers.remove("Three", 3);
System.out.println("Is the entry Three removed? " + result);
System.out.println("Updated HashMap: " + numbers);
}
}
Kết quả
HashMap: {One=1, Two=2, Three=3}
Removed value: 2
Is the entry Three removed? True
Updated HashMap: {One=1}
Thay thế các phần tử trong HashMap
replace(key, value)– thay thếvalueliên kết với Key được chỉ định bằng mộtvaluemớireplace(key, old, new)– thay thếvalue oldbằngvalue newnếuvalue oldđã liên kết vớiKeyđược chỉ địnhreplaceAll(function)– thay thế từngvaluecủa map bằng kết quả của hàm được chỉ định
java
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> numbers = new HashMap<>();
numbers.put("First", 1);
numbers.put("Second", 2);
numbers.put("Third", 3);
System.out.println("Original HashMap: " + numbers);
// Using replace()
numbers.replace("Second", 22);
numbers.replace("Third", 3, 33);
System.out.println("HashMap using replace(): " + numbers);
// Using replaceAll()
numbers.replaceAll((key, oldValue) -> oldValue + 2);
System.out.println("HashMap using replaceAll(): " + numbers);
}
}
Kết quả
Original HashMap: {Second=2, Third=3, First=1}
HashMap using replace: {Second=22, Third=33, First=1}
HashMap using replaceAll: {Second=24, Third=35, First=3}
Trong chương trình trên chú ý câu lệnh
java
numbers.replaceAll((key, oldValue) -> oldValue + 2);
Ở đây, hàm này truy cập tất cả các mục của map. Sau đó, nó thay thế tất cả các value bằng các value mới được cung cấp bởi biểu thức lambda.
Tính toán lại các value của HashMap
compute()- Tính toán một value mới bằng cách sử dụng hàm được chỉ định. Sau đó, nó liên kếtvalueđược tính toán vớikeyđược chỉ định.computeIfAbsent()- Nếu key được chỉ định không được liên kết với bất kỳvaluenào, hàm này sẽ tính toán mộtvaluemới bằng cách sử dụng hàm được chỉ định. Sau đó, nó liên kếtvaluemới vớikey.computeIfPresent()- Nếu key được chỉ định đã được liên kết với bất kỳvaluenào, hàm này sẽ tính toán mộtvaluemới bằng cách sử dụng hàm được chỉ định. Sau đó, nó liên kếtvaluemới vớikey.
java
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> numbers = new HashMap<>();
numbers.put("First", 1);
numbers.put("Second", 2);
System.out.println("Original HashMap: " + numbers);
// Using compute()
numbers.compute("First", (key, oldValue) -> oldValue + 2);
numbers.compute("Second", (key, oldValue) -> oldValue + 1);
System.out.println("HashMap using compute(): " + numbers);
// Using computeIfAbsent()
numbers.computeIfAbsent("Three", key -> 5);
System.out.println("HashMap using computeIfAbsent(): " + numbers);
// Using computeIfPresent()
numbers.computeIfPresent("Second", (key, oldValue) -> oldValue * 2);
System.out.println("HashMap using computeIfPresent(): " + numbers);
}
}
Kết quả
Original HashMap: {Second=2, First=1}
HashMap using compute(): {Second=3, First=3}
HashMap using computeIfAbsent(): {Second=3 First=3, Three=5}
HashMap using computeIfPresent(): {Second=6, First=3, three=5}
Trong ví dụ trên, chúng ta đã tính toán lại các value của map bằng hàm compute().
Ở đây, chúng ta đã sử dụng các biểu thức lambda làm đối số hàm để tính toán lại các value. merge() - liên kết value được chỉ định với để key được chỉ định nếu key đó chưa được liên kết với value nào. Tuy nhiên, nếu key được chỉ định đã được liên kết với một value, nó sẽ hợp nhất value được chỉ định mới với value cũ hiện có. Ví dụ:
java
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> numbers = new HashMap<>();
numbers.put("First", 1);
numbers.put("Second", 2);
System.out.println("Original HashMap: " + numbers);
// Using merge() Method
numbers.merge("First", 4, (oldValue, newValue) -> oldValue + newValue);
System.out.println("New HashMap: " + numbers);
}
}
Kết quả
Original HashMap: {Second=2, First=1}
New HashMap: {Second=2, First=5}
Trong ví dụ trên, hàm merge() này có 3 tham số: key , newValue và biểu thức lambda (biểu thức này tính value hợp nhất mới).
Lặp qua HashMap
Trong một HashMap, chúng ta có thể
- Lặp qua các
keycủa nó - Lặp qua các
valuecủa nó - Lặp qua các
key/valuecủa nó
Ví dụ sử dụng forEach
java
import java.util.HashMap;
import java.util.Map.Entry;
class Main {
public static void main(String[] args) {
// Creating a HashMap
HashMap<String, Integer> numbers = new HashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("HashMap: " + numbers);
// Accessing the key/value pair
System.out.print("Entries: ");
for(Entry<String, Integer> entry: numbers.entrySet()) {
System.out.print(entry);
System.out.print(", ");
}
// Accessing the key
System.out.print("\nKeys: ");
for(String key: numbers.keySet()) {
System.out.print(key);
System.out.print(", ");
}
// Accessing the value
System.out.print("\nValues: ");
for(Integer value: numbers.values()) {
System.out.print(value);
System.out.print(", ");
}
}
}
Kết quả
HashMap: {One=1, Two=2, Three=3}
Entries: One=1, Two=2, Three=3
Keys: One, Two, Three,
Values: 1, 2, ,3,
Trong chương trình trên, lưu ý rằng chúng ta đã import gói java.util.Map.Entry. Ở đây, Map.Entry là class trong của Map interface. Class trong này trả về một view (các phần tử) của map.
Ví dụ sử dụng hàm iterator()
Cũng có thể lặp lại HashMap bằng cách sử dụng hàm iterator(). Để sử dụng hàm này, chúng ta phải import java.util.Iterator gói.
java
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
class Main {
public static void main(String[] args) {
// Creating a HashMap
HashMap<String, Integer> numbers = new HashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("HashMap: " + numbers);
// Creating an object of Iterator
Iterator<Entry<String, Integer>> iterate1 = numbers.entrySet().iterator();
// Accessing the Key/Value pair
System.out.print("Entries: ");
while(iterate1.hasNext()) {
System.out.print(iterate1.next());
System.out.print(", ");
}
// Accessing the key
Iterator<String> iterate2 = numbers.keySet().iterator();
System.out.print("\nKeys: ");
while(iterate2.hasNext()) {
System.out.print(iterate2.next());
System.out.print(", ");
}
// Accessing the value
Iterator<Integer> iterate3 = numbers.values().iterator();
System.out.print("\nValues: ");
while(iterate3.hasNext()) {
System.out.print(iterate3.next());
System.out.print(", ");
}
}
}
Kết quả
HashMap: {One=1, Two=2, Three=3}
Entries: One=1, Two=2, Three=3
Keys: One, Two, Three,
Values: 1, 2, 3,
Trong chương trình trên, lưu ý rằng chúng ta đã import gói java.util.Map.Entry. Ở đây, Map.Entry là class trong của Map interface. Class trong này trả về một view (các phần tử) của map.
Các hàm khác của HashMap
| Hàm | Mô tả |
|---|---|
clear() |
Xóa tất cả các mục khỏi map |
containsKey() |
Kiểm tra xem map có chứa key được chỉ định hay không và trả về giá trị boolean |
containsValue() |
Kiểm tra xem map có chứa value được chỉ định hay không và trả về giá trị boolean |
size() |
Trả về kích cỡ của map |
isEmpty() |
Kiểm tra xem map có trống không và trả về giá trị boolean |