1. Giới thiệu
Đây là bài giảng đầu tiên của cấp độ bonus. Chúng ta đã tiến rất gần đến việc học OOP. Và tôi muốn hâm nóng sự quan tâm của bạn và đi trước một chút 😈. Ở cấp độ hiện tại, tôi sẽ kể cho bạn về 5 điều thú vị:
- ♾️ Bạn sẽ học cách tạo các mảng vô hạn
- 📖 Sau đó là duy trì “từ điển cá nhân”
- 💾 Tiếp theo, tôi sẽ giới thiệu sơ lược về làm việc với tệp
- 🌐 Rồi chúng ta sẽ học cách tải hình ảnh từ Internet
- 🛰️ Và ở bài cuối của cấp độ, bạn sẽ theo dõi Trạm Vũ trụ Quốc tế (ISS) theo thời gian thực
Cách mọi thứ hoạt động “bên trong” bạn sẽ biết ở các cấp độ sau; còn hôm nay, bạn chỉ cần học cách sử dụng các công cụ tôi cung cấp. Hứng thú chứ? Vậy bắt đầu thôi 😇.
Ôn lại mảng thông thường
Hãy nhớ lại mảng thông thường trong Java:
int[] arr = new int[10];
Đây là một công cụ tuyệt vời, nhưng nó có vài hạn chế: kích thước cố định, không thể thêm hoặc bớt phần tử nếu không tạo mảng mới. Đôi khi ta muốn một mảng có thể lớn lên và thu nhỏ theo nhu cầu. Và chúng ta có giải pháp tuyệt vời — mảng động ArrayList!
ArrayList là “mảng thông minh”, có thể tự động tăng/giảm kích thước. Khác với mảng thông thường, nơi kích thước là cố định, ArrayList tự lo liệu để luôn đủ chỗ cho các phần tử mới.
Tạo mảng vô hạn
Để tạo ArrayList của chúng ta, hãy viết đoạn mã như sau:
ArrayList<String> array = new ArrayList<String>()
Sau đó có thể thêm phần tử vào đó:
array.add("Masha");
array.add("Katya");
Tạo mảng động cho số nguyên
Như bạn có thể đã đoán, kiểu phần tử của mảng động phải được chỉ rõ trong dấu ngoặc nhọn. Ở đó bạn có thể chỉ định bất kỳ kiểu nào, ngoại trừ các kiểu nguyên thủy. Với kiểu nguyên thủy, bạn cần dùng các kiểu bao (wrapper).
Ví dụ:
ArrayList<Integer> numbers = new ArrayList<Integer>(); // int
ArrayList<Double> fees = new ArrayList<Double>(); // double
ArrayList<Boolean> yesList = new ArrayList<Boolean>(); // boolean
ArrayList<Character> chars = new ArrayList<Character>(); // char
ArrayList của chúng ta không hỗ trợ [index] để truy cập phần tử, nhưng nó có các phương thức chuyên dụng đáp ứng mọi nhu cầu của bạn. Hãy điểm qua những phương thức thú vị nhất.
2. Phương thức add(element) — thêm phần tử
Việc đầu tiên ta làm với danh sách là thêm dữ liệu vào đó. Dùng phương thức add. Nó đặt phần tử vào cuối danh sách.
ArrayList<String> todo = new ArrayList<>(); // danh sách việc cần làm
todo.add("Học ArrayList");
todo.add("Pha trà");
todo.add("Đi dạo");
Sau ba dòng này, ta có một danh sách gồm ba chuỗi. Khác với mảng, ta không cần chỉ định kích thước trước — nó tự tăng khi thêm phần tử.
Rất tiện: bạn có thể bắt đầu với danh sách rỗng và dần dần bổ sung tùy theo hành động của người dùng hoặc dữ liệu đầu vào của chương trình.
3. Phương thức get(index) — truy cập theo chỉ số
Mỗi phần tử trong danh sách có số thứ tự riêng — chỉ số. Chỉ số luôn bắt đầu từ 0. Tức là phần tử đầu tiên có số 0, phần tử thứ hai có số 1, v.v.
Nếu muốn lấy phần tử theo số, dùng phương thức get.
String task = todo.get(1);
System.out.println("Việc thứ hai: " + task);
Kết quả:
Việc thứ hai: Pha trà
Điều quan trọng cần nhớ: nếu truy cập vào một chỉ số không tồn tại (ví dụ, todo.get(10) khi danh sách chỉ có ba phần tử), chương trình sẽ ném lỗi IndexOutOfBoundsException. Vì vậy, bạn luôn phải hoặc chắc chắn về chỉ số, hoặc kiểm tra kích thước danh sách qua size().
4. Phương thức set(index, element) — thay thế phần tử
Đôi khi bạn cần thay thế một phần tử trong danh sách. Trong trường hợp này, không cần xóa rồi thêm lại — chỉ cần dùng phương thức set.
todo.set(1, "Pha cà phê");
System.out.println("Bây giờ việc thứ hai: " + todo.get(1));
Kết quả:
Bây giờ việc thứ hai: Pha cà phê
Vì vậy, set là cách cập nhật danh sách “ngay tại chỗ”.
5. Phương thức remove(index) — xóa phần tử
Có thể xóa phần tử khỏi ArrayList theo chỉ số.
todo.remove(0);
System.out.println("Việc đầu tiên bây giờ: " + todo.get(0));
Kết quả:
Việc đầu tiên bây giờ: Pha cà phê
Chúng ta đã xóa phần tử đầu tiên (chỉ số 0). Và bây giờ phần tử thứ hai trở thành thứ nhất, còn phần tử trước đây là thứ ba trở thành thứ hai. Lưu ý quan trọng: sau khi xóa, các phần tử của danh sách sẽ dịch chuyển.
Điều này đôi khi khiến người mới bất ngờ. Hãy luôn nhớ rằng sau khi xóa, các chỉ số sẽ được tính lại.
6. Phương thức size() — biết kích thước danh sách
Phương thức size trả về số phần tử trong danh sách. Điều này giống với thuộc tính length của mảng, nhưng với ArrayList — đó là một phương thức.
System.out.println("Tổng số việc: " + todo.size());
Kết quả:
Tổng số việc: 2
Thường size được dùng trong vòng lặp để duyệt tất cả phần tử:
for (int i = 0; i < todo.size(); i++)
{
System.out.println(todo.get(i));
}
7. Phương thức contains(element) — kiểm tra sự tồn tại
Để biết danh sách có chứa phần tử cần tìm hay không, hãy dùng contains. Phương thức này trả về true hoặc false.
System.out.println(todo.contains("Đi dạo"));
System.out.println(todo.contains("Pha trà"));
Kết quả:
true
false
Phương thức này rất hữu ích khi bạn muốn tránh trùng lặp hoặc kiểm tra điều kiện “danh sách có phần tử như vậy hay không”.
8. Duyệt các phần tử
Có hai cách để duyệt danh sách.
Vòng lặp theo chỉ số
Cách này hữu ích khi bạn cần số thứ tự của phần tử.
for (int i = 0; i < todo.size(); i++)
{
System.out.println(i + ": " + todo.get(i));
}
Vòng lặp for-each
Nếu không cần số thứ tự và bạn chỉ muốn xem tất cả phần tử — hãy dùng vòng lặp for-each.
for (String task : todo)
{
System.out.println("Việc: " + task);
}
Vòng lặp này ngắn gọn hơn và dễ đọc hơn.
9. Thực hành: ArrayList trong ứng dụng của bạn
Hãy làm một danh sách việc cần làm có thể thêm và in ra:
import java.util.ArrayList;
import java.util.Scanner;
public class TodoApp
{
public static void main(String[] args)
{
ArrayList<String> todo = new ArrayList<>();
Scanner console = new Scanner(System.in);
while (true)
{
System.out.print("Nhập một việc (hoặc dòng trống để thoát): ");
String task = console.nextLine();
if (task.isEmpty()) break;
todo.add(task);
}
System.out.println("Danh sách việc của bạn:");
for (int i = 0; i < todo.size(); i++)
{
System.out.println((i + 1) + ". " + todo.get(i));
}
}
}
Hy vọng bạn thích “mảng vô hạn” của chúng ta. Nó là collection đầu tiên của Java mà bạn gặp. Tôi nghĩ bạn cũng sẽ thích những collection còn lại.
GO TO FULL VERSION