VieTopik
Tiếng HànTiếng Anh.NET (C#)Java
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
Java CoreDữ liệu
Bài 9/19
5 phút

Map

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 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ằng new 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á.
  • containsKey kiểm tra khoá có tồn tại không.
  • foreach qua entrySet() lấy ra từng cặp, đọc bằng getKey() và getValue().
  • HashMap không giữ thứ tự thêm vào: vòng lặp trên in BOOK-02 trước PEN-01.
PEN-01 120 BOOK-02 35
Map stock: mỗi khoá trỏ tới một giá trị

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
80

Vẫ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 đè.
  • get với khoá không tồn tại trả về null, nên kiểm tra bằng containsKey trước.
  • foreach qua entrySet() lấy ra từng cặp với getKey() và getValue().

Tự kiểm tra

0/3 câu
Câu 1

Bạ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?

Câu 2

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?

Câu 3

int qty = stock.get("PEN"); làm chương trình dừng với NullPointerException. Nguyên nhân?

Array và ListClass và object

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt