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:
HashMap
lưu trữ dữ liệu dưới dạng cặpkey
vàvalue
.HashMap
chỉ chứa cáckey
duy nhất.HashMap
có thể có 1 key lànull
và nhiều giá trịnull
.HashMap
duy 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:
Key
là code định danh duy nhất được sử dụng để liên kết từng phần tử (value) trong mapValue
là 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ủaHashMap
này là8
. Ý nghĩa: nó có thể lưu trữ 8 mục.loadFactor
– Hệ số tải củahashmap
nà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/value
của mapkeySet()
– trả về một tập hợp gồm tất cả cáckey
của mapvalues()
– trả về một tập hợp gồm tất cả cácvalue
củ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ềvalue
liên kết với key được chỉ định. Trả vềnull
nếu không tìm thấy key.getOrDefault()
- Trả về value liên kết với key được chỉ định. Trả vềvalue
mặ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ếvalue
liên kết với Key được chỉ định bằng mộtvalue
mớireplace(key, old, new)
– thay thếvalue old
bằngvalue new
nếuvalue old
đã liên kết vớiKey
được chỉ địnhreplaceAll(function)
– thay thế từngvalue
củ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ỳvalue
nào, hàm này sẽ tính toán mộtvalue
mới bằng cách sử dụng hàm được chỉ định. Sau đó, nó liên kếtvalue
mới vớikey
.computeIfPresent()
- Nếu key được chỉ định đã được liên kết với bất kỳvalue
nào, hàm này sẽ tính toán mộtvalue
mới bằng cách sử dụng hàm được chỉ định. Sau đó, nó liên kếtvalue
mớ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
key
của nó - Lặp qua các
value
của nó - Lặp qua các
key/value
củ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 |