ArrayList là một trong những lớp trong lập trình Java. ArrayList cung cấp nhiều tính năng và phương thức hữu ích để thao tác với danh sách các phần tử. Hãy cùng Rikkei Academy tìm hiểu về ArrayList trong Java, đặc điểm, phương thức, và một số thao tác cơ bản với ArrayList nhé!
Arraylist trong Java là gì?
ArrayList là lớp triển khai của Interface List. Nó cho phép tạo ra các mảng động (dynamic) có thể tự động thay đổi kích thước khi chạy. Điều này có nghĩa là bạn có thể thêm hoặc xóa các phần tử trong mảng một cách linh hoạt mà không cần phải lo lắng về kích thước của mảng.
Ví dụ dễ hiểu, ArrayList giống như một dãy ghế trong một rạp chiếu phim. Bạn có thể thêm một ghế vào dãy, bỏ một ghế hoặc thay đổi vị trí của ghế dễ dàng mà không ảnh hưởng đến các ghế khác.
Phân tầng của lớp ArrayList trong Java là gì?
- AbstractList được sử dụng để triển khai một danh sách không thể sửa đổi
- CopyOnWriteArrayList triển khai Interface List. Đây là một phiên bản nâng cao của ArrayList trong đó tất cả các thay đổi (add, set, remove, vv.) được thực hiện bằng cách tạo một bản sao mới của danh sách.
- AbstractSequentialList: Lớp này triển khai Interface Collection và lớp AbstractCollection. Lớp này được sử dụng để triển khai một danh sách không thể sửa đổi, trong đó chỉ cần mở rộng lớp AbstractList và triển khai phương thức get() và size().
Các đặc điểm quan trọng của Arraylist trong Java?
- Kế thừa và triển khai: ArrayList kế thừa lớp AbstractList và triển khai giao diện List. Điều này có nghĩa là nó có thể sử dụng tất cả các phương thức và chức năng trong List Interface.
- Thay đổi kích thước động: Kích thước của ArrayList có thể được tăng tự động nếu collection tăng hoặc co lại nếu các đối tượng được loại bỏ khỏi collections. Điều này làm cho nó trở thành một collection có thể thay đổi kích thước theo yêu cầu.
- Truy cập ngẫu nhiên: Java ArrayList cho phép truy cập danh sách ngẫu nhiên. Điều này có nghĩa là bất kỳ phần tử nào trong danh sách trực tiếp đều có thể truy cập được bằng cách sử dụng chỉ số gắn với nó, giống như cách chúng ta làm với mảng (array).
- Dựa trên đối tượng: ArrayList chỉ có thể lưu trữ các đối tượng (object), không thể lưu trữ các kiểu dữ liệu nguyên thủy như int, char, v.v. Để sử dụng các kiểu này với ArrayList, bạn cần sử dụng các lớp bao tương ứng.
- Tương đồng với vector C++: ArrayList trong Java có thể được xem như một vector trong C++. Cả hai đều là collection động có thể thay đổi kích thước theo yêu cầu.
- Không đồng bộ: ArrayList không đồng bộ. Nghĩa là nếu nhiều luồng truy cập một ArrayList cùng một lúc, điều này có thể dẫn đến các dữ liệu không nhất quán và có thể gẫy lỗi trong quá trình thực thi. Nếu bạn cần sử dụng ArrayList trong một môi trường đa luồng, bạn nên sử dụng lớp Vector thay thế để đảm bảo an toàn cho dữ liệu.
Các phương thức khởi tạo (constructor) của ArrayList trong Java
Tên constructor | Mô tả |
ArrayList() | Tạo một ArrayList rỗng với kích thước ban đầu là 10. |
ArrayList(int initialCapacity) | Tạo một ArrayList rỗng với kích thước ban đầu được chỉ định. |
ArrayList(Collection<? extends E> c) | Tạo một ArrayList chứa các phần tử của Collection đã cho, theo thứ tự chúng được trả về bởi bộ lặp. |
Các phương thức (method) của ArrayList trong Java
Lớp ArrayList là một trong những lớp triển khai List Interface trong Java. Do đó, toàn bộ các phương thức của List Interface đều có sẵn trong lớp ArrayList, bao gồm cả các phương thức cơ bản và các phương thức khác.
Tên method | Mô tả |
add(E e) | Thêm phần tử vào cuối danh sách. |
add(int index, E e) | Thêm phần tử vào vị trí chỉ định trong danh sách. |
clear() | Xóa tất cả các phần tử khỏi danh sách. |
contains(Object o) | Kiểm tra danh sách có chứa phần tử được chỉ định hay không. |
get(int index) | Trả về phần tử tại vị trí chỉ định trong danh sách. |
indexOf(Object o) | Trả về chỉ số của sự xuất hiện đầu tiên của phần tử được chỉ định trong danh sách, hoặc -1 nếu danh sách không chứa phần tử. |
isEmpty() | Kiểm tra danh sách có rỗng hay không. |
remove(int index) | Xóa phần tử tại vị trí chỉ định trong danh sách. |
remove(Object o) | Xóa sự xuất hiện đầu tiên của phần tử được chỉ định khỏi danh sách, nếu có. |
set(int index, E e) | Thay thế phần tử tại vị trí chỉ định trong danh sách với phần tử được chỉ định. |
size() | Trả về số phần tử trong danh sách. |
toArray() | Trả về một mảng chứa tất cả các phần tử trong danh sách theo đúng thứ tự. |
trimToSize() | Cắt giảm dung lượng của mảng nội bộ của danh sách xuống mức cần thiết để lưu trữ số lượng phần tử hiện tại của danh sách. |
ensureCapacity(int minCapacity) | Tăng kích thước của mảng nội bộ của danh sách, nếu cần, để đảm bảo nó có thể chứa ít nhất minCapacity phần tử. |
Một số thao tác phổ biến với ArrayList trong Java
Dưới đây là một số các thao tác phổ biến với ArrayList trong Java
Khởi tạo một ArrayList trong Java
Để sử dụng lớp ArrayList trong Java, trước hết, bạn cần import gói thư viện java.util bằng cách sử dụng lệnh import như sau:
import java.util.ArrayList;
Lệnh import này cho phép chương trình sử dụng lớp ArrayList mà không cần phải chỉ định đầy đủ tên gói của lớp đó.
Cú pháp khởi tạo một ArrayList như sau:
ArrayList<TênKiểuDữLiệu> tênArrayList = new ArrayList<>(); |
Từ phiên bản Java SE 5.0 trở lên, lớp generic parameter type đã được áp dụng trong lớp ArrayList của Java, cho phép chỉ định kiểu dữ liệu của các phần tử trong ArrayList, nghĩa là ta có thể tạo nhiều ArrayList khác nhau để lưu trữ nhiều kiểu dữ liệu khác nhau. Khi khởi tạo một ArrayList kiểu generic trong Java, ta sẽ chỉ định kiểu dữ liệu mà ArrayList sẽ lưu trữ bằng cách sử dụng generic type parameter. Generic type parameter được đặt trong dấu ngoặc <> và được đặt sau tên của lớp ArrayList. Ví dụ:
Để khởi tạo một ArrayList chứa các đối tượng kiểu String, ta sử dụng cú pháp sau:
ArrayList<String> stringList = new ArrayList<String>(); |
Nếu ta muốn khởi tạo một ArrayList chứa các đối tượng kiểu custom, ta chỉ cần thay Type bằng tên của kiểu dữ liệu đó trong cú pháp khởi tạo.
ArrayList<Person> personList = new ArrayList<Person>(); |
Lưu ý: Trong Java, các kiểu dữ liệu nguyên thủy như int, float, char, v.v. không phải là đối tượng, do đó, ta không thể trực tiếp sử dụng chúng trong các cấu trúc dữ liệu như ArrayList. Thay vào đó, bạn có thể sử dụng wrapper class tương ứng như Integer, Float, Character, v.v. để bọc các giá trị nguyên thủy và sử dụng trong các cấu trúc dữ liệu.
Thao tác với phần tử của ArrayList trong Java phổ biến
Thêm phần tử vào ArrayList
Để thêm phần tử vào ArrayList, bạn có thể sử dụng phương thức: add()
- add(E e): Thêm phần tử vào cuối danh sách.
- add(int index, E e): Thêm phần tử vào danh sách tại vị trí chỉ định.
Ví dụ:
import java.util.ArrayList;
public class ThemPhanTu { public static void main(String[] args) { ArrayList<String> hoaQua = new ArrayList<>(); // Bước 1: Thêm phần tử vào cuối danh sách hoaQua.add(“Táo”); hoaQua.add(“Cam”); hoaQua.add(“Nho”); System.out.println(“Danh sách hoa quả sau khi thêm: ” + hoaQua); // Kết quả: Danh sách hoa quả sau khi thêm: [Táo, Cam, Nho] // Bước 2: Thêm phần tử vào vị trí chỉ định hoaQua.add(1, “Dưa hấu”); System.out.println(“Danh sách hoa quả sau khi thêm vào vị trí chỉ định: ” + hoaQua); // Kết quả: Danh sách hoa quả sau khi thêm vào vị trí chỉ định: [Táo, Dưa hấu, Cam, Nho] } } |
Xóa phần tử khỏi ArrayList
Để xóa phần tử khỏi ArrayList, bạn có thể lựa chọn một trong hay phương thức remove() và clear()
- remove(int index): Xóa phần tử tại vị trí chỉ định.
- remove(Object o): Xóa phần tử đầu tiên có giá trị chỉ định.
- clear(): Xóa tất cả các phần tử trong danh sách.
Ví dụ:
import java.util.ArrayList;
public class XoaPhanTu { public static void main(String[] args) { ArrayList<String> hoaQua = new ArrayList<>(); hoaQua.add(“Táo”); hoaQua.add(“Cam”); hoaQua.add(“Nho”); System.out.println(“Danh sách hoa quả trước khi xóa: ” + hoaQua); // Kết quả: Danh sách hoa quả trước khi xóa: [Táo, Cam, Nho] //Xóa phần tử tại vị trí chỉ định hoaQua.remove(1); System.out.println(“Danh sách hoa quả sau khi xóa tại vị trí chỉ định: ” + hoaQua); // Kết quả: Danh sách hoa quả sau khi xóa tại vị trí chỉ định: [Táo, Nho] //Xóa phần tử đầu tiên có giá trị chỉ định hoaQua.remove(“Nho”); System.out.println(“Danh sách hoa quả sau khi xóa phần tử đầu tiên có giá trị chỉ định: ” + hoaQua); // Kết quả: Danh sách hoa quả sau khi xóa phần tử đầu tiên có giá trị chỉ định: [Táo] //Xóa tất cả các phần tử trong danh sách hoaQua.clear(); System.out.println(“Danh sách hoa quả sau khi xóa tất cả các phần tử: ” + hoaQua); // Kết quả: Danh sách hoa quả sau khi xóa tất cả các phần tử: [] } } |
Truy cập phần tử trong ArrayList
Muốn truy cập phần tử ArrayList trong Java, bạn sẽ cần sử dụng phương thức get(). Với cú pháp get(int index) để trả về phần tử tại vị trí chỉ định.
Ví dụ:
import java.util.ArrayList;
public class TruyCapPhanTu { public static void main(String[] args) { ArrayList<String> hoaQua = new ArrayList<>(); hoaQua.add(“Táo”); hoaQua.add(“Cam”); hoaQua.add(“Nho”); String quaCam = hoaQua.get(1); System.out.println(“Phần tử tại vị trí 1 trong danh sách hoa quả: ” + quaCam); // Kết quả: Phần tử tại vị trí 1 trong danh sách hoa quả: Cam } } |
Thay đổi phần tử trong ArrayList
Chúng ta sử dụng phương thức set() để thay đổi phần tử ArrayList trong Java.
- set(int index, E e): Thay thế phần tử tại vị trí chỉ định bằng phần tử mới.
Ví dụ:
import java.util.ArrayList;
public class CapNhatPhanTu { public static void main(String[] args) { ArrayList<String> hoaQua = new ArrayList<>(); hoaQua.add(“Táo”); hoaQua.add(“Cam”); hoaQua.add(“Nho”); System.out.println(“Danh sách hoa quả trước khi cập nhật: ” + hoaQua); // Kết quả: Danh sách hoa quả trước khi cập nhật: [Táo, Cam, Nho] hoaQua.set(1, “Dưa hấu”); System.out.println(“Danh sách hoa quả sau khi cập nhật: ” + hoaQua); // Kết quả: Danh sách hoa quả sau khi cập nhật: [Táo, Dưa hấu, Nho] } } |
Kiểm tra phần tử có tồn tại trong ArrayList
Phương thức contains(Object o) dùng để kiểm tra xem danh sách có chứa phần tử chỉ định hay không.
Ví dụ:
import java.util.ArrayList;
public class KiemTraTonTai { public static void main(String[] args) { ArrayList<String> hoaQua = new ArrayList<>(); hoaQua.add(“Táo”); hoaQua.add(“Cam”); hoaQua.add(“Nho”); boolean coCam = hoaQua.contains(“Cam”); System.out.println(“Danh sách hoa quả có chứa ‘Cam’ không? ” + coCam); // Kết quả: Danh sách hoa quả có chứa ‘Cam’ không? true } } |
Tìm vị trí xuất hiện của phần tử trong ArrayList
Để tìm vị trí xuất hiện của phần tử ArrayList trong Java, chúng ta có thể sử dụng phương thức indexOf() hoặc lastIndexOf(Object o), trong đó:
- indexOf(Object o): Trả về vị trí đầu tiên xuất hiện của phần tử chỉ định trong danh sách, hoặc -1 nếu danh sách không chứa phần tử đó.
- lastIndexOf(Object o): Trả về vị trí cuối cùng xuất hiện của phần tử chỉ định trong danh sách, hoặc -1 nếu danh sách không chứa phần tử đó.
Ví dụ:
import java.util.ArrayList;
public class TimViTriDauTien { public static void main(String[] args) { ArrayList<String> hoaQua = new ArrayList<>(); hoaQua.add(“Táo”); hoaQua.add(“Cam”); hoaQua.add(“Nho”); int viTriCam = hoaQua.indexOf(“Cam”); System.out.println(“Vị trí đầu tiên xuất hiện của ‘Cam’ trong ArrayList: ” + viTriCam); // Kết quả: Vị trí đầu tiên xuất hiện của ‘Cam’ trong ArrayList: 1 int viTriCamCuoiCung = hoaQua.lastIndexOf(“Cam”); System.out.println(“Vị trí cuối cùng xuất hiện của ‘Cam’ trong ArrayList: ” + viTriCamCuoiCung); // Kết quả: Vị trí cuối cùng xuất hiện của ‘Cam’ trong ArrayList: 3 } } |
Lặp qua phần tử của ArrayList trong Java
Trong Java, để lặp qua các phần tử của một ArrayList, ta có thể sử dụng Iterator hoặc For-each loop.
- Iterator: Iterator là một interface trong Java cho phép ta lặp qua các phần tử của một tập hợp (collection) bất kỳ (bao gồm ArrayList) theo một cách an toàn và hiệu quả.
Ví dụ:
import java.util.ArrayList;
import java.util.Iterator; public class Example { public static void main(String[] args) { ArrayList<String> names = new ArrayList<>(); names.add(“Alice”); names.add(“Bob”); names.add(“Charlie”); Iterator<String> iterator = names.iterator(); while (iterator.hasNext()) { String name = iterator.next(); System.out.println(name); } } } |
- For-each loop: là một cú pháp rút gọn giúp ta lặp qua các phần tử của một tập hợp (bao gồm ArrayList) một cách dễ dàng và tiện lợi.
Ví dụ:
import java.util.ArrayList;
public class Example { public static void main(String[] args) { ArrayList<String> names = new ArrayList<>(); names.add(“Alice”); names.add(“Bob”); names.add(“Charlie”); for (String name : names) { System.out.println(name); } } } |
Một số thao tác với khác
Lấy kích thước của ArrayList
Ta dùng phương thức: size() để lấy kích thức của ArrayList
- size(): Trả về số lượng phần tử trong danh sách.
Ví dụ:
import java.util.ArrayList;
public class LayKichThuoc { public static void main(String[] args) { ArrayList<String> hoaQua = new ArrayList<>(); hoaQua.add(“Táo”); hoaQua.add(“Cam”); hoaQua.add(“Nho”); int kichThuoc = hoaQua.size(); System.out.println(“Kích thước của danh sách hoa quả: ” + kichThuoc); // Kết quả: Kích thước của danh sách hoa quả: 3 } } |
Chuyển đổi ArrayList thành mảng
Để chuyển đổi ArrayList thành mảng, bạn có thể sử dụng hương thức: toArray()
- toArray(): Trả về một mảng chứa tất cả các phần tử trong danh sách theo thứ tự chính xác.
Ví dụ:
import java.util.ArrayList;
import java.util.Arrays; public class ArrayListToMang { public static void main(String[] args) { ArrayList<String> hoaQua = new ArrayList<>(); hoaQua.add(“Táo”); hoaQua.add(“Cam”); hoaQua.add(“Nho”); String[] mangHoaQua = hoaQua.toArray(new String[0]); System.out.println(“Mảng chứa các phần tử của ArrayList: ” + Arrays.toString(mangHoaQua)); // Kết quả: Mảng chứa các phần tử của ArrayList: [Táo, Cam, Nho] } } |
Chuyển đổi mảng thành ArrayList
Để chuyển đổi mảng thành ArrayList, bạn dùng phương thức: Arrays.asList()
- Arrays.asList(T… a): Trả về một danh sách tĩnh có cấu trúc dữ liệu giống ArrayList, chứa các phần tử trong mảng được truyền vào.
Ví dụ:
import java.util.ArrayList;
import java.util.Arrays; public class MangToArrayList { public static void main(String[] args) { String[] mangHoaQua = { “Táo”, “Cam”, “Nho” }; ArrayList<String> hoaQua = new ArrayList<>(Arrays.asList(mangHoaQua)); System.out.println(“ArrayList chứa các phần tử của mảng: ” + hoaQua); // Kết quả: ArrayList chứa các phần tử của mảng: [Táo, Cam, Nho] } } |
Ưu điểm khuyết điểm của Arraylist trong java
ArrayList là một lớp trong Java để lưu trữ và quản lý một tập hợp các phần tử. Trong quá trình sử dụng ArrayList có những ưu điểm và khuyết điểm cần lưu ý:
Ưu điểm
- Kích thước động: ArrayList có thể tự động tăng hoặc giảm kích thước, giúp cho việc thêm hoặc xóa phần tử dễ dàng hơn so với mảng thông thường.
- Dễ sử dụng: ArrayList có cú pháp đơn giản, dễ sử dụng.
- Truy cập theo thứ tự: ArrayList duy trì thứ tự của các phần tử. Do đó, bạn có thể truy cập các phần tử theo thứ tự mà chúng được thêm vào.
- Hỗ trợ giá trị null: ArrayList có thể lưu trữ giá trị null, hữu ích trong trường hợp cần đại diện cho sự vắng mặt của một giá trị.
Khuyết điểm
- Chậm hơn mảng: ArrayList chậm hơn mảng đối với một số thao tác, chẳng hạn như chèn phần tử vào giữa danh sách.
- Tăng bộ nhớ: ArrayList yêu cầu nhiều bộ nhớ hơn so với mảng, vì nó cần duy trì kích thước động và xử lý việc thay đổi kích thước.
- Không an toàn đối với luồng: ArrayList không an toàn đối với luồng, có nghĩa là nhiều luồng có thể truy cập và sửa đổi đồng thời các phần tử trong danh sách. Điều này có thể dẫn đến các lỗi và làm cho chương trình không hoạt động đúng cách
- Giảm hiệu suất: Hiệu suất của ArrayList có thể giảm khi số lượng phần tử trong danh sách tăng lên, đặc biệt là trong các thao tác như tìm kiếm phần tử hoặc chèn phần tử vào giữa danh sách.
Nên dùng ArrayList, Array hay LinkedList trong Java?
Array, ArrayList và LinkedList đều là các lớp để lưu trữ một danh sách các phần tử. Tuy nhiên, chúng có các đặc tính và phương thức khác nhau phù hợp với trường hợp sử dụng khác nhau.
Sử dụng Array khi:
- Lượng phần tử trong danh sách là cố định và không thay đổi về sau.
- Cần truy cập các phần tử trong danh sách nhanh chóng.
- Cần sử dụng các phép toán toán học trên danh sách.
Sử dụng ArrayList khi:
- Muốn thay đổi số lượng phần tử trong danh sách có thể thay đổi về sau.
- Cần thêm hoặc xóa các phần tử trong danh sách thường xuyên.
- Cần truy cập các phần tử trong danh sách một cách ngẫu nhiên.
Sử dụng LinkedList khi:
- Cần thêm hoặc xóa các phần tử trong danh sách một cách thường xuyên, đặc biệt là ở giữa danh sách.
- Cần truy cập các phần tử trong danh sách một cách ngẫu nhiên.
- Cần tiết kiệm bộ nhớ và không quan tâm đến tốc độ truy cập các phần tử trong danh sách.
Kết luận
Qua bài viết này, Rikkei Academy đã cung cấp các kiến thức cơ bản về ArrayList trong Java trên nhiều khía cạnh khác nhau. Hy vọng các thông tin trên đã cung cấp cho bạn cái nhìn tổng quan nhất về ArrayList cũng như cách sử dụng lớp này trong Java.
Nếu bạn đang muốn tìm hiểu khóa học lập trình Java, tham khảo ngay Rikkei Academy! Với lộ trình tinh gọn, bám sát thực tế công việc và phương pháp đào tạo tiên tiến giúp bạn nhanh chóng trở thành lập trình viên chỉ trong 6 tháng! Đăng ký để nhận tư vấn miễn phí ngay hôm nay!