Bạn mệt mỏi vì phải khai báo kích thước mảng trước khi dùng? Bạn không phải người duy nhất, vì không luôn tiện phải định nghĩa mảng lưu bao nhiêu giá trị trước khi bắt đầu thêm giá trị.
Đó là nơi người bạn hữu ích, Java ArrayList, xuất hiện.
Trong hướng dẫn này, chúng ta sẽ nói về ArrayList là gì, cách hoạt động, và so sánh với mảng truyền thống. Chúng ta cũng sẽ đi qua các phương thức quan trọng nhất cần biết để làm việc hiệu quả với lớp ArrayList. Hãy bắt đầu!
ArrayList là gì?
ArrayList là loại danh sách đặc biệt cho phép tạo mảng thay đổi kích thước (resizable arrays). Lớp ArrayList thực thi giao diện List (List interface), dùng để lưu trữ dữ liệu có thứ tự.
Khi làm việc với mảng trong Java, bạn phải khai báo kích thước mảng trước khi lưu giá trị. Thường gặp trường hợp không biết trước muốn lưu bao nhiêu giá trị trước khi khai báo, gây vấn đề.
Lớp ArrayList cho phép định nghĩa mảng không cần báo trước số giá trị có thể lưu. ArrayList, đôi khi gọi là mảng động (dynamic arrays), có thể thay đổi dung lượng khi thêm hoặc xóa phần tử.
Cách tạo ArrayList
Hãy bắt đầu ở nơi rõ ràng: khai báo ArrayList. Thiết lập nó khác khá nhiều so với khai báo mảng, vì dùng giao diện List Java.
Mở file Java và dán mã sau vào lớp chính:
import java.util.ArrayList; ArrayList<String> songs = new ArrayList<>();
Chúng ta vừa tạo array list tên songs. String là kiểu dữ liệu lưu trong mảng và ArrayList là loại đối tượng muốn tạo.
Chúng ta phải import ArrayList vì nó từ thư viện Java util.
Lưu ý bạn không thể tạo array list dùng kiểu dữ liệu nguyên thủy (primitive). Nếu muốn khai báo mảng số nguyên, ví dụ, không dùng kiểu int nguyên thủy; cần dùng lớp Integer.
Lưu ý chúng ta không phải chỉ định ArrayList cần lưu bao nhiêu giá trị. Đó là vì ArrayLists là động.
Cách thêm phần tử vào ArrayList
Phương thức add() cho phép thêm một phần tử vào danh sách. Giả sử muốn thêm hai bài hát vào songs array list: Love Me Do và Help! (cả hai của The Beatles).
Mở file Java mới và viết mã sau:
import java.util.ArrayList; class Main { public static void main(String[] args) { ArrayList<String> songs = new ArrayList<>(); songs.add("Love Me Do"); songs.add("Help!"); System.out.println("Songs: " + songs); } } Mã trả về: Songs: [Love Me Do, Help!]
Giống mảng, mục trong ArrayList được cho số chỉ mục riêng. Điều này vì mục trong ArrayList được sắp xếp và số báo chương trình biết thứ tự mỗi mục trong danh sách xuất hiện. Nếu cần, bạn có thể chỉ định vị trí chỉ mục muốn thêm mục:
songs.add(0, "Love Me Do");
Điều này thêm mục "Love Me Do" tại vị trí chỉ mục 0 vào danh sách songs.
Khởi tạo ArrayList (Initialize an ArrayList)
Khi khai báo mảng, bạn có thể khởi tạo trực tiếp bằng chỉ định giá trị muốn gán cho mảng. ArrayLists không hoạt động vậy. Bạn phải dùng phương thức đặc biệt asList() từ lớp Arrays để khởi tạo ArrayList. asList() trả về mảng như danh sách có thể đọc bởi lớp ArrayList.
Bạn có thể muốn khởi tạo ArrayList với giá trị nếu đã có vài giá trị muốn thêm vào danh sách.
Bạn có thể dùng vòng lặp for thêm từng mục riêng lẻ. Tuy nhiên, cách đó phức tạp hơn thiết lập và kém hiệu quả hơn khởi tạo danh sách với giá trị dùng asList().
Hãy bắt đầu bằng import thư viện sẽ dùng:
import java.util.ArrayList; import java.util.Arrays;
Chúng ta viết lớp khởi tạo ArrayList songs với hai giá trị:
class Main { public static void main(String[] args) { ArrayList<String> songs = new ArrayList(Arrays.asList("Love Me Do", "Help!")); System.out.println("Songs: " + songs); } } Trong mã này, chúng ta khai báo ArrayList lưu giá trị chuỗi. Chúng ta dùng asList() yêu cầu mã khởi tạo array list với hai giá trị mặc định, giống hai bài hát Beatles thêm ở ví dụ trước.
Lấy mục từ ArrayList (Retrieve an Item from an ArrayList)
Lớp ArrayList có phương thức tiện lợi get() cho phép truy cập phần tử array list. Để dùng phương thức này, phải chỉ định vị trí chỉ mục phần tử muốn truy cập.
Xem ví dụ:
import java.util.ArrayList; class Main { public static void main(String[] args) { ArrayList<String> songs = new ArrayList<>(); songs.add("Love Me Do"); songs.add("Help!"); System.out.println("Second song: " + songs.get(1)); } } Trong mã, chúng ta tạo array list và thêm hai giá trị. Chúng ta dùng songs.get(1) lấy bài hát tại vị trí chỉ mục 1 trong danh sách. Mã trả về:
Second song: Help!
Cập nhật ArrayList (Update an ArrayList)
Cập nhật array list dễ như thêm phần tử. Có phương thức built-in set() dùng để thay đổi giá trị lưu trong danh sách. Xem mã sau:
import java.util.ArrayList; class Main { public static void main(String[] args) { ArrayList<String> songs = new ArrayList<>(); songs.add("Love Me Do"); songs.add("Help!"); System.out.println("Songs: " + songs); songs.set(1, "Come Together"); System.out.println("Songs: " + songs); } } Mã trả về:
Songs: [Love Me Do, Help!]
Songs: [Love Me Do, Come Together]
Trong mã, chúng ta thêm hai giá trị – "Love Me Do" và "Help!" – vào danh sách. Chúng ta thay mục vị trí chỉ mục 1 thành "Come Together". Điều này thay "Help!" thành "Come Together" trong danh sách. Khi in danh sách cuối chương trình, thấy đã được sửa đổi.
Xóa phần tử khỏi ArrayList (Remove an Element from an ArrayList)
Phần tử không phải ở trong ArrayList mãi mãi. Bạn có thể xóa phần tử dùng phương thức remove() bất kỳ lúc nào. Tên phương thức dễ nhớ!
Xem ví dụ:
import java.util.ArrayList; class Main { public static void main(String[] args) { ArrayList<String> songs = new ArrayList<>(); songs.add("Love Me Do"); songs.add("Help!"); System.out.println("Songs: " + songs); String removed = songs.remove(0); System.out.println("Songs: " + songs); System.out.println(removed); } } Trong ví dụ này, thêm hai mục vào array list. Chúng ta xóa mục vị trí chỉ mục 0. Mã trả về:
Songs: [Love Me Do, Help!]
Songs: [Help!]
Love Me Do
Chúng ta vừa xóa Love Me Do khỏi array list. Phương thức remove() trả về tên mục đã xóa, gán cho biến removed. Chúng ta in giá trị biến này ra console cuối chương trình.
Duyệt qua ArrayList (Iterate Through an ArrayList)
Nếu muốn lặp qua ArrayList? Bạn làm được dùng vòng lặp for hoặc for-each, tùy thích.
Giả sử muốn in tất cả bài hát Beatles trong danh sách ra console, mỗi giá trị trên dòng mới. Chúng ta làm được dùng mã sau:
import java.util.ArrayList; class Main { public static void main(String[] args) { ArrayList<String> songs = new ArrayList<>(); songs.add("Love Me Do"); songs.add("Help!"); for (int i = 0; i < songs.size(); i++) { System.out.println(songs.get(i)); } } } Trong chương trình, chúng ta dùng vòng lặp for duyệt qua mọi mục array list. Với mỗi mục, in ra console trên dòng riêng. Vòng lặp tiếp tục cho đến khi mọi mục đã in.
Lưu ý chúng ta dùng phương thức songs.size() trong chương trình. Phương thức size() cho biết bao nhiêu giá trị lưu trong array list.
Mã trả về:
Love Me Do
Help!
Tương tự, bạn có thể dùng vòng lặp for-each duyệt array list. Điều này vì for-each hỗ trợ lặp qua bất kỳ đối tượng lặp được (iterable). Xem ví dụ:
import java.util.ArrayList; class Main { public static void main(String[] args) { ArrayList<String> songs = new ArrayList<>(); songs.add("Love Me Do"); songs.add("Help!"); for (String song : songs) { System.out.println(song); } } } Chương trình này tương tự cả cấu trúc và mục đích; in tất cả giá trị songs array list ra console. Khác biệt là dùng vòng lặp for-each duyệt từng giá trị.
Bạn có thể chọn for-each thay vì for vì dễ đọc hơn, nhưng cả hai phương pháp đều hiệu quả.
Kết luận
Lớp Java ArrayList cho phép định nghĩa mảng lưu nhiều giá trị mà không cần báo trước số lượng giá trị.
Chúng ta mới chỉ cào bề mặt dùng ArrayList trong Java. Để tìm hiểu thêm, bạn có thể xem các hướng dẫn:
- Chuyển đổi ArrayList sang Array
- Cách khởi tạo ArrayList
- Cách sắp xếp ArrayList
Bây giờ bạn không còn lo nghĩ nếu không biết mảng cần lưu bao nhiêu giá trị. Bạn sẽ dùng ArrayList giải quyết vấn đề!