Map
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 5.Tóm tắt
Kho có hàng nghìn sản phẩm, và bạn cần biết ngay mã PEN-01 còn bao nhiêu
cái. Duyệt cả list để tìm thì chậm và dài dòng. Map cho phép tra thẳng bằng
mã.
Khái niệm
📖 Map: tập hợp các cặp khoá–giá trị, tra giá trị theo khoá, viết là Map<kiểu khoá, kiểu giá trị>.
🔑 Khoá (key): giá trị dùng để tra cứu, mỗi khoá chỉ xuất hiện một lần trong map.
Ví dụ
void main() {
Map<String, Integer> stock = new HashMap<>();
stock.put("PEN-01", 120);
stock.put("BOOK-02", 35);
System.out.println(stock.get("PEN-01")); // 120
System.out.println(stock.size()); // 2
System.out.println(stock.containsKey("X")); // false
for (var item : stock.entrySet()) {
System.out.println("%s: %d".formatted(
item.getKey(), item.getValue()));
}
}Map<String, Integer>: khoá là mã sản phẩm (String), giá trị là số lượng (Integer). Tạo map bằngnew HashMap<>().stock.put("PEN-01", 120)thêm cặp mới, hoặc ghi đè nếu khoá đã có.stock.get("PEN-01")đọc giá trị theo khoá.containsKeykiểm tra khoá có tồn tại không.foreachquaentrySet()lấy ra từng cặp, đọc bằnggetKey()vàgetValue().HashMapkhông giữ thứ tự thêm vào: vòng lặp trên inBOOK-02trướcPEN-01.
Thử ngay
Dán vào Main.java rồi chạy java Main.java:
void main() {
Map<String, Integer> stock = new HashMap<>();
stock.put("PEN-01", 120);
stock.put("BOOK-02", 35);
stock.put("PEN-01", 80);
System.out.println(stock.size());
System.out.println(stock.get("PEN-01"));
}Đoán trước khi chạy: gán PEN-01 hai lần thì map có 2 hay 3 cặp?
Xem kết quả
2
80Vẫn 2 cặp. Khoá là duy nhất, nên lần put thứ hai chỉ ghi đè giá trị cũ của
PEN-01 thành 80.
Lỗi hay gặp
Đọc khoá không tồn tại. get trả về null, nghĩa là không có giá trị.
Gán null vào biến int làm chương trình dừng với lỗi
NullPointerException.
// SAI — lỗi khi chạy: không có khoá "RULER"
void main() {
Map<String, Integer> stock = new HashMap<>();
stock.put("PEN-01", 120);
int qty = stock.get("RULER");
}// ĐÚNG — kiểm tra trước khi đọc
void main() {
Map<String, Integer> stock = new HashMap<>();
stock.put("PEN-01", 120);
if (stock.containsKey("RULER")) {
int qty = stock.get("RULER");
System.out.println(qty);
} else {
System.out.println("Không có mã này");
}
}Dùng put để cộng thêm hàng. put với khoá đã có ghi đè giá trị cũ,
không cộng dồn.
// SAI — muốn nhập thêm 80 cái, nhưng còn đúng 80
void main() {
Map<String, Integer> stock = new HashMap<>();
stock.put("PEN-01", 120);
stock.put("PEN-01", 80);
}// ĐÚNG — đọc giá trị cũ rồi cộng thêm: 200
void main() {
Map<String, Integer> stock = new HashMap<>();
stock.put("PEN-01", 120);
stock.put("PEN-01", stock.get("PEN-01") + 80);
}Tóm tắt
- Map lưu cặp khoá–giá trị và tra giá trị thẳng theo khoá.
- Mỗi khoá là duy nhất.
put(key, value)sẽ thêm mới hoặc ghi đè. getvới khoá không tồn tại trả vềnull, nên kiểm tra bằngcontainsKeytrước.foreachquaentrySet()lấy ra từng cặp vớigetKey()vàgetValue().
Tự kiểm tra
0/3 câuBạn cần tra nhanh tên khách hàng theo số điện thoại. Kiểu nào phù hợp nhất?
Map<String, Long> prices = new HashMap<>(); prices.put("A", 10L); prices.put("B", 20L); prices.put("A", 15L); Tổng các giá trị là bao nhiêu?
int qty = stock.get("PEN"); làm chương trình dừng với NullPointerException. Nguyên nhân?