ArrayList: Túi Thần Kỳ Của Dữ Liệu Trong Java (Creyt's Guide)
Java – OOP

ArrayList: Túi Thần Kỳ Của Dữ Liệu Trong Java (Creyt's Guide)

Author

Admin System

@root

Ngày xuất bản

22 Mar, 2026

Lượt xem

1 Lượt

ArrayList class

Chào các 'đệ tử' của Creyt! Hôm nay, chúng ta sẽ 'mổ xẻ' một 'siêu phẩm' trong thế giới Java mà anh em Gen Z hay gọi là 'túi thần kỳ' của dữ liệu: ArrayList. Nghe tên thôi đã thấy nó 'nghệ' rồi đúng không? Mà nói thật, nó 'nghệ' thật đấy!

1. ArrayList là gì mà 'ngon' vậy?

Các em cứ hình dung thế này: hồi xưa, khi mình dùng Array truyền thống, nó giống như việc mình đi mua một cái hộp đựng đồ vậy. Mua cái hộp 10 ngăn thì chỉ đựng được 10 món, muốn đựng 11 món là 'toang', phải đi mua cái hộp khác to hơn. Cố định, cứng nhắc, 'ông bà già' lắm!

Thế rồi, ArrayList xuất hiện. Nó như một cái 'túi không đáy' của Doraemon vậy đó! Các em muốn bỏ bao nhiêu thứ vào cũng được, nó tự động giãn ra, co lại theo nhu cầu. Hay như một cái 'playlist nhạc' trên Spotify của các em vậy: thích bài nào thì add vào, chán bài nào thì remove đi, thứ tự vẫn 'chuẩn chỉnh' theo ý mình.

Về mặt 'học thuật' một chút, ArrayList là một class trong Java Collections Framework, nằm trong gói java.util. Nó 'kế thừa' từ AbstractList và 'thực thi' (implement) List interface. Điều này có nghĩa là nó mang đầy đủ 'phẩm chất' của một List (có thứ tự, cho phép trùng lặp) và được xây dựng 'nền tảng' trên một Array (mảng) động. Chính cái từ 'động' này làm nên sự 'linh hoạt' của nó. Khi ArrayList 'cảm thấy' sắp đầy, nó sẽ tự động tạo ra một mảng mới lớn hơn (thường là 1.5 lần kích thước hiện tại) và sao chép tất cả các phần tử cũ sang mảng mới. 'Ảo diệu' chưa?

Nói tóm lại: ArrayList dùng để lưu trữ một tập hợp các đối tượng theo thứ tự, có thể chứa các phần tử trùng lặp và quan trọng nhất là kích thước của nó có thể thay đổi linh hoạt trong quá trình chạy chương trình. Đây chính là 'cứu tinh' khi các em không biết chính xác mình cần bao nhiêu chỗ để lưu dữ liệu.

2. Code Ví Dụ Minh Họa: 'Túi Thần Kỳ' Hoạt Động Thế Nào?

Giờ thì 'xắn tay áo' vào code một chút để thấy 'phép màu' của ArrayList nhé. Anh sẽ dùng ví dụ về một danh sách các 'món ăn vặt' yêu thích của Gen Z.

import java.util.ArrayList;
import java.util.List; // Thường dùng List interface để khai báo, tăng tính linh hoạt (polymorphism)

public class ArrayListDemo {
    public static void main(String[] args) {
        // 1. Khởi tạo một ArrayList để lưu trữ các món ăn vặt (kiểu String)
        // Luôn dùng Generics (<String>) để đảm bảo an toàn kiểu dữ liệu và tránh lỗi runtime
        List<String> monAnVatYeuThich = new ArrayList<>();

        System.out.println("--- Khởi tạo danh sách món ăn vặt ---");
        System.out.println("Danh sách hiện tại rỗng: " + monAnVatYeuThich.isEmpty()); // Kiểm tra rỗng
        System.out.println("Số lượng món trong danh sách: " + monAnVatYeuThich.size()); // Kích thước

        // 2. Thêm các món ăn vào 'túi' (phương thức add())
        monAnVatYeuThich.add("Trà sữa trân châu đường đen");
        monAnVatYeuThich.add("Bánh tráng trộn");
        monAnVatYeuThich.add("Chân gà sả tắc");
        monAnVatYeuThich.add("Khoai tây chiên");
        monAnVatYeuThich.add("Trà sữa trân châu đường đen"); // Cho phép trùng lặp

        System.out.println("\n--- Sau khi thêm các món ăn ---");
        System.out.println("Danh sách hiện tại: " + monAnVatYeuThich);
        System.out.println("Số lượng món trong danh sách: " + monAnVatYeuThich.size());

        // 3. Truy cập một món ăn theo 'số thứ tự' (index) (phương thức get())
        // Lưu ý: index bắt đầu từ 0
        String monThuHai = monAnVatYeuThich.get(1);
        System.out.println("\nMón ăn thứ hai trong danh sách là: " + monThuHai);

        // 4. Cập nhật một món ăn (phương thức set())
        // Thay thế "Khoai tây chiên" (index 3) bằng "Bánh mì nướng muối ớt"
        monAnVatYeuThich.set(3, "Bánh mì nướng muối ớt");
        System.out.println("\n--- Sau khi cập nhật món ăn ---");
        System.out.println("Danh sách hiện tại: " + monAnVatYeuThich);

        // 5. Xóa một món ăn (phương thức remove())
        // Có thể xóa theo index hoặc theo giá trị
        monAnVatYeuThich.remove(0); // Xóa món đầu tiên ("Trà sữa trân châu đường đen")
        System.out.println("\n--- Sau khi xóa món đầu tiên theo index ---");
        System.out.println("Danh sách hiện tại: " + monAnVatYeuThich);

        monAnVatYeuThich.remove("Chân gà sả tắc"); // Xóa món "Chân gà sả tắc" theo giá trị
        System.out.println("\n--- Sau khi xóa 'Chân gà sả tắc' theo giá trị ---");
        System.out.println("Danh sách hiện tại: " + monAnVatYeuThich);
        System.out.println("Số lượng món còn lại: " + monAnVatYeuThich.size());

        // 6. Duyệt qua tất cả các món ăn trong danh sách (sử dụng vòng lặp for-each)
        System.out.println("\n--- Danh sách món ăn vặt còn lại (duyệt bằng for-each) ---");
        for (String monAn : monAnVatYeuThich) {
            System.out.println("- " + monAn);
        }

        // 7. Xóa tất cả các món ăn (phương thức clear())
        monAnVatYeuThich.clear();
        System.out.println("\n--- Sau khi xóa tất cả các món ---");
        System.out.println("Danh sách hiện tại: " + monAnVatYeuThich);
        System.out.println("Danh sách có rỗng không? " + monAnVatYeuThich.isEmpty());
    }
}
Illustration

3. Mẹo Vặt (Best Practices) Từ 'Lão Làng' Creyt

Để dùng ArrayList một cách 'thông thái' và tránh những 'cú lừa' không đáng có, các em nhớ mấy 'mẹo' này:

Gợi Ý Đọc Tiếp
Implements trong Java: Hợp đồng code cho GenZ

4 Lượt xem

  • Luôn dùng Generics: Hồi xưa, Java 'ngây thơ' lắm, cho phép mình khai báo ArrayList mà không cần chỉ định kiểu dữ liệu (new ArrayList()). Nhưng đó là 'cạm bẫy' của ClassCastException ở runtime. Giờ thì 'lớn rồi', phải khai báo rõ ràng ArrayList<String>, ArrayList<Integer>, ArrayList<SinhVien>... để trình biên dịch (compiler) giúp mình 'soi' lỗi từ sớm, an toàn hơn nhiều.
  • Khai báo bằng Interface List: Thay vì ArrayList<String> monAnVat = new ArrayList<String>();, hãy dùng List<String> monAnVat = new ArrayList<String>();. Tại sao ư? Đây là một nguyên tắc vàng trong OOP: 'lập trình theo interface, không phải implementation'. Nếu sau này các em muốn chuyển sang dùng LinkedList (một loại List khác) vì lý do hiệu năng, các em chỉ cần thay đổi phần new LinkedList<>() mà không cần sửa đổi toàn bộ code dùng biến monAnVat. 'Chất' chưa?
  • Hiểu rõ hiệu năng: ArrayList rất 'nhanh như chớp' khi các em cần truy cập phần tử theo chỉ mục (get(index)) vì nó dựa trên mảng. Tuy nhiên, khi các em thêm hoặc xóa phần tử ở giữa danh sách, nó phải 'xê dịch' tất cả các phần tử còn lại, việc này có thể 'tốn sức' (tốn thời gian) nếu danh sách quá dài.
  • Dùng isEmpty() thay vì size() == 0: Cả hai đều đúng, nhưng isEmpty() rõ ràng hơn về ý nghĩa và đôi khi có thể hiệu quả hơn một chút (mặc dù với ArrayList thì không khác biệt nhiều).
  • trimToSize() khi cần: Nếu các em biết chắc rằng ArrayList của mình sẽ không thêm phần tử nào nữa và muốn giải phóng bộ nhớ thừa (do ArrayList thường cấp phát dư để tránh resize liên tục), hãy gọi monAnVatYeuThich.trimToSize();.

4. ArrayList 'tung hoành' ở đâu trong đời thực?

Các em nghĩ xem, những ứng dụng các em dùng hàng ngày có cần đến danh sách linh hoạt không? Chắc chắn là có, và rất nhiều là đằng khác!

  • Shopee/Lazada/Tiki: Cái 'giỏ hàng' của các em chính là một ArrayList<Product> đấy! Các em thêm sản phẩm vào, bớt sản phẩm ra, số lượng cứ thế mà thay đổi. Danh sách sản phẩm gợi ý, danh sách sản phẩm đã xem cũng tương tự.
  • Facebook/Instagram: 'Dòng thời gian' (feed) của các em là một ArrayList<Post>. Mỗi khi các em cuộn xuống, các bài đăng mới lại được thêm vào danh sách. Danh sách bạn bè, danh sách người theo dõi cũng vậy.
  • Spotify/YouTube: 'Playlist' nhạc hay danh sách video 'Xem sau' chính là ArrayList<Song> hay ArrayList<Video>. Thêm bài, xóa bài, thay đổi thứ tự, tất cả đều 'mượt mà' nhờ ArrayList.
  • Game: Danh sách các vật phẩm trong túi đồ của nhân vật, danh sách kẻ địch đang xuất hiện trên màn hình, danh sách các nhiệm vụ đang chờ hoàn thành.

5. Khi nào thì 'triệu hồi' ArrayList, khi nào thì 'né'?

Giống như mọi công cụ, ArrayList có điểm mạnh và điểm yếu. Biết khi nào dùng nó là cả một nghệ thuật!

  • Nên dùng khi:

    • Các em cần một danh sách có thứ tự và cho phép các phần tử trùng lặp.
    • Các em cần truy cập phần tử nhanh chóng bằng chỉ mục (ví dụ: lấy phần tử thứ 5, thứ 10).
    • Các em thường xuyên thêm phần tử vào cuối danh sách.
    • Các em không biết trước số lượng phần tử cần lưu trữ.
  • Nên cân nhắc hoặc 'né' khi:

    • Các em thường xuyên thêm hoặc xóa phần tử ở giữa danh sách. Trong trường hợp này, LinkedList có thể là một lựa chọn tốt hơn vì nó không phải 'xê dịch' các phần tử còn lại.
    • Các em cần một tập hợp các phần tử không trùng lặp và không quan tâm đến thứ tự (khi đó HashSet có thể phù hợp hơn).
    • Các em biết chính xác kích thước danh sách và nó sẽ không thay đổi (khi đó Array truyền thống có thể hiệu quả hơn về bộ nhớ và hiệu suất một chút).

Vậy đó, các em thấy không? ArrayList không chỉ là một cái tên 'cool ngầu' mà còn là một 'trợ thủ đắc lực' giúp chúng ta xử lý dữ liệu một cách linh hoạt và hiệu quả trong Java. Nắm vững nó, các em sẽ 'nâng tầm' khả năng code của mình lên một level mới! Cứ thực hành nhiều vào, có gì thắc mắc cứ 'tag' Creyt nhé!

Thuộc Series: Java – OOP

Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!

#tech #cyberpunk #laravel
Chỉnh sửa bài viết

Bình luận (0)

Vui lòng Đăng Nhập để Bình luận

Hỗ trợ Markdown cơ bản
Nguyễn Văn A
1 ngày trước

Tính năng này đỉnh quá ad ơi, chờ mãi mới thấy một blog Tiếng Việt có UI/UX xịn như vầy!