1. ArrayList trong Java là gì?

Lớp ArrayList trong Java là một lớp sử dụng một mảng động để lưu trữ các phần tử. ArrayList cũng giống như một mảng, nhưng không có giới hạn về kích thước. Chúng ta có thể thêm hoặc bớt các phần tử bất cứ lúc nào. Chính vị vậy, nó linh hoạt hơn nhiều so với mảng truyền thống của Java.

Lớp ArrayList trong Java cho phép chúng ta có  thể lưu trữ các phần tử trùng lặp. Lớp ArrayList() kế thừa lại từ lớp AbstractList()  làm lớp triển khai của Interface List. Vì vậy nên, chúng ta có thể sử dụng tất cả các phương thức của List cho lớp ArrayList. Ngoài ra, ArrayList được coi là một cấu trúc mảng động (vì các phần tử được đặt ở vị trí ngẫu nhiên trong bộ nhớ) và chúng ta hoàn toàn có thể truy cập các phần tử bên trong mảng này thông qua chỉ số.

Chúng ta hoàn toàn có thể tìm thấy ArrayList trong gói java.util. vì vậy để sử dụng được lớp này, ta cần nhập vào thư viện import java.util.*;

2. Khai báo ArrayList trong Java

ArrayList là một lớp tương tự như mảng, khi muốn khai báo một ArrayList để phục vụ cho việc lưu trữ các phần tử ta cần chỉ ra được kiểu dữ liệu mà mảng đó sẽ lưu trữ các phần tử. Việc khai báo một ArrayList chính là việc khởi tạo một đối tượng cho lớp ArrayList(). Cú pháp khởi tạo một ArrayList trong Java như sau:

ArrayList<typeElement> name = new ArrayList<typeElement>();

Trong đó:

  • typeElement là kiểu dữ liệu lưu trữ các phần tử của ArrayList
  • name là tên của đối tượng ArrayList cần khởi tạo

Lớp ArrayList() trong Java sẽ gồm 4 constructor. Dưới đây là bảng liệt kê các constructor của lớp này và mô tả các cách sử dụng các constructor đó:

Constructor Mô tả
ArrayList() Hàm khởi tạo mặc định sẽ khởi tạo một ArrayList trống!
ArrayList(Collection<? extends E> c) Khởi tạo một ArrayList với các phần tử được nạp từ Collection c
ArrayList(int capacity) Khởi tạo một ArrayList với kích thước được chỉ định

Trong bài này, chúng ta sẽ khởi tạo ArrayList bằng hàm khởi tạo mặc định của nó. Như trong ví dụ dưới đây, chúng ta sẽ cùng nhau khởi tạo một ArrayList mới. Sau khi khởi tạo ArrayList thành công chúng ta sẽ kiểm tra ArrayList đó có rỗng hay không? Và hiển thị ra các phần tử có trong ArrayList vừa khởi tạo!

import java.util.*;  
public class Main{  
    public static void main(String args[]){  
    	//Khoi tao ArrayList moi luu tru cac phan tu mang kieu String
    	ArrayList<String> arrayList = new ArrayList<String>();   
        //Kiem tra ArrayList vua tao co rong hay khong?
        boolean result = arrayList.isEmpty();
        System.out.println("ArrayList vua tao co rong hay khong? \n" + result); 
        //Kiem tra phan tu trong ArrayList
        System.out.println("Phan tu co trong ArrayList la: \n" + arrayList); 
    }  
}

Nhận xét: Khi một lớp ArrayList được khởi tạo, mặc định ArrayList đó sẽ là một mảng rỗng. Các phần tử bên trong ArrayList đó sẽ được lữu trữ trong cặp dấu ngoặc vuông [ ]  – điểu này tương tự với List trong Java.

3. Thao tác với ArrayList trong Java

ArrayList cũng tương tự như mảng, vì vậy mà trong mảng gồm những thao tác gì thì trong ArrayList cũng có tương tự như vậy. Tuy nhiên, ArrayList sẽ có nhiều ưu điểm về mặt lưu trữ và dễ sử dụng hơn so với mảng thông thường trong Java. Các thao tác khi làm việc với ArrayList đó là: thêm phần tử vào ArrayList, duyệt các phần tử ArrayList, sắp xếp phần tử ArrayList, tìm kiếm phần tử ArrayList, xóa phần tử ArrayList …. 

3.1 Thêm phần tử vào ArrayList trong Java

Thêm phần tử vào ArrayList không giống như việc thêm phần tử vào mảng thông thường của Java. Nếu như ở mảng thông thường việc thêm phần tử vào một mảng ta chỉ cần truy cập đến phần tử cần thêm và gán giá trị cần thêm vào phần tử đó thì khi sử dụng lớp ArrayList ta lại cần sử dụng một phương thức để thêm phần tử vào trong nó.

Lớp ArrayList đã cung cấp sẵn cho chúng ta một phương thức để thực hiện việc thêm phần tử vào nó. Đó là phương thức add() – phương thức này sẽ nhận vào giá trị cần thêm vào mảng. Giá trị cần thêm vào mảng này sẽ phải có kiểu dữ liệu giống như kiểu dữ liệu của mảng mà ta đã khai báo.

import java.util.*;  
public class Main{  
    public static void main(String args[]){  
    	//Khai bao ArrayList voi kieu String
        ArrayList<String> arrayList = new ArrayList<String>();  
        //Kiem tra ArrayList vua tao co rong hay khong?
        boolean result = arrayList.isEmpty();
        System.out.println("ArrayList vua tao co rong hay khong? \n" + result); 
        //Kiem tra phan tu trong ArrayList
        System.out.println("Phan tu co trong ArrayList la: \n" + arrayList); 
        
        //Them phan tu vao ArrayList
        arrayList.add("Xoai");
        arrayList.add("Tao");    
        arrayList.add("Nho");    
        arrayList.add("Dua");    
        
        //Kiem tra ArrayList sau khi them phan tu co rong hay khong?
        boolean result2 = arrayList.isEmpty();
        System.out.println("ArrayList sau khi them phan tu rong hay khong? \n" + result2); 
        //Kiem tra phan tu trong ArrayList
        System.out.println("Phan tu co trong ArrayList sau khi them: \n" + arrayList);   
    }  
}

Kết quả:

ArrayList vua tao co rong hay khong? 
true
Phan tu co trong ArrayList la: 
[]
ArrayList sau khi them phan tu rong hay khong? 
false
Phan tu co trong ArrayList sau khi them: 
[Xoai, Tao, Nho, Dua]

3.2 Duyệt các phần tử trong ArrayList

Tương tự như mảng, việc duyệt qua các phần tử có trong ArrayList cũng có thể được thực hiện thông qua vòng lặp for. Ngoài ra, chúng ta còn có thể duyệt qua các phần tử có trong ArrayList thông qua đối tượng Iterator.

  • Duyệt các phần tử trong ArrayList bằng vòng lặp for
import java.util.*;  
public class Main{  
    public static void main(String args[]){  
    	//Khai bao ArrayList voi kieu String
        ArrayList<String> arrayList = new ArrayList<String>();  
        //Them phan tu vao ArrayList
        arrayList.add("Xoai");
        arrayList.add("Tao");    
        arrayList.add("Nho");    
        arrayList.add("Dua");    
        
        //Kiem tra phan tu trong ArrayList 
        System.out.println("Phan tu co trong ArrayList la: \n" + arrayList);
        //Duyet cac phan tu trong ArrayList bang vong lap for
        System.out.println("Duyet cac phan tu trong ArrayList");    
        //Coi cac phan tu la cac item
        for(String item : arrayList){  
            //Hien thi tung phan tu (item) trong ArrayList
            System.out.println(item);    
        }   
    }  
}

Kết quả:

Phan tu co trong ArrayList la: 
[Xoai, Tao, Nho, Dua]
Duyet cac phan tu trong ArrayList
Xoai
Tao
Nho
Dua
  • Duyệt các phần tử trong ArrayList thông qua đối tượng Iterator
import java.util.*;  
public class Main{  
    public static void main(String args[]){  
    	//Khai bao ArrayList voi kieu String
        ArrayList<String> arrayList = new ArrayList<String>();  
        //Them phan tu vao ArrayList
        arrayList.add("Xoai"); 
        arrayList.add("Tao"); 
        arrayList.add("Nho"); 
        arrayList.add("Dua");   
        //Kiem tra phan tu trong ArrayList
        System.out.println("Phan tu co trong ArrayList la: \n" + arrayList);
        
        //Duyet cac phan tu trong ArrayList bang vong lap for
        System.out.println("Duyet cac phan tu trong ArrayList");    
        //Khoi tao doi tuong lap iterator
        Iterator itr = arrayList.iterator();
        //Duyet qua tung phan tu trong ArrayList
        while(itr.hasNext()){
            //Hien thi gia tri cua tung phan tu trong ArrayList
            System.out.println(itr.next());
        }   
    }  
}

Kết quả:

Phan tu co trong ArrayList la: 
[Xoai, Tao, Nho, Dua]
Duyet cac phan tu trong ArrayList
Xoai
Tao
Nho
Dua

3.3 Sắp xếp phần tử trong ArrayList

Khi một ArrayList được khởi tạo thành công, các phần tử sẽ không được sắp xếp theo một thứ tự nhất định nào đó. Điều này cũng tương tự như một mảng trong Java.

Tuy nhiên, nếu bạn cần sắp xếp lại các phần tử trong ArrayList theo một thứ tự (tăng dần hoặc giảm dần) thì vẫn hoàn toàn có thể thực hiện được nó một cách dễ dàng thông qua phương thức Collections.sort(). Phương thức này cần truyền vào ArrayList và mặc định sẽ sắp xếp các phần tử ArrayList theo trình tự tăng dần.

import java.util.*;  
public class Main{  
    public static void main(String args[]){  
    	//Khai bao ArrayList voi kieu String
        ArrayList<String> arrayList = new ArrayList<String>();  
        //Them phan tu vao ArrayList
        arrayList.add("An"); 
        arrayList.add("Binh"); 
        arrayList.add("Chinh"); 
        arrayList.add("Dung");   
        //Kiem tra phan tu trong ArrayList
        System.out.println("Phan tu co trong ArrayList la: \n" + arrayList);
        
        //Sap xep ArrayList tang dan
        Collections.sort(arrayList);  
        //Duyet va hien thi phan tu sau khi sap xep
        System.out.println("Phan tu sau khi sap xep");
        for(String item : arrayList){
    	    System.out.println(item); 
        }
        
        
        //Khai bao ArrayList2 voi kieu Integer
        ArrayList<Integer> arrayList2 = new ArrayList<Integer>();  
        //Them phan tu vao ArrayList2
        arrayList2.add(55); 
        arrayList2.add(11); 
        arrayList2.add(44); 
        arrayList2.add(33);  
        //Kiem tra phan tu trong ArrayList2
        System.out.println("\nPhan tu co trong ArrayList2 la: \n" + arrayList);
        
        //Sap xep ArrayList2 tang dan
        Collections.sort(arrayList2);  
        //Duyet va hien thi phan tu sau khi sap xep
        System.out.println("Phan tu ArrayList2 sau khi sap xep");
        for(Integer item : arrayList2){
    	    System.out.println(item); 
        }
    }  
}

Kết quả:

Phan tu co trong ArrayList la: 
[An, Binh, Chinh, Dung]
Phan tu sau khi sap xep
An
Binh
Chinh
Dung

Phan tu co trong ArrayList2 la: 
[An, Binh, Chinh, Dung]
Phan tu ArrayList2 sau khi sap xep
11
33
44
55

3.4 Tìm kiếm phần tử trong ArrayList

Việc tìm kiếm phần tử trong một ArrayList sẽ là công việc thực hiện kiểm tra xem phần tử cần tìm có thuộc trong ArrayList hay không? Nếu có thì phần tử đó nằm ở vị trí nào của ArrayList?

Khi thao tác với ArrayList trong Java, chúng ta sẽ dễ dàng tìm kiếm được một phần tử trong ArrayList thông qua phương thức indexOf() – phương thức này cần truyền vào giá trị phần tử cần tìm và nó sẽ trả về vị trí phần tử cần tìm nếu nó thuộc trong ArrayList.

Ngoài ra, chúng ta cũng có thể sử dụng phương thức contains() để kiểm tra xem phần tử cần tìm có trong ArrayList hay không? Trả về true nếu có và ngược lại thì trả về False nếu phần tử đó không tồn tại trong ArrayList.

import java.util.*;  
public class Main{  
    public static void main(String args[]){  
    	//Khai bao ArrayList voi kieu String
        ArrayList<String> arrayList = new ArrayList<String>();  
        //Them phan tu vao ArrayList
        arrayList.add("An"); 
        arrayList.add("Binh"); 
        arrayList.add("Chinh"); 
        arrayList.add("Dung");   
        //Kiem tra phan tu trong ArrayList
        System.out.println("Phan tu co trong ArrayList la: \n" + arrayList);
        
        //Tim kiem phan tu Binh trong ArrayList
        boolean result = arrayList.contains("Binh");
        //Neu tim thay phan tu
        if(result == true){
       	    //Hien thi vi tri cua phan tu sau khi tim thay
            System.out.println("Tim thay phan tu Binh co vi tri: " + arrayList.indexOf("Binh"));
        }else{//Nguoc lai, neu khong tim thay phan tu
            System.out.println("Khong tim thay phan tu");
        }
    }  
}

Kết quả:

Phan tu co trong ArrayList la: 
[An, Binh, Chinh, Dung]
Tim thay phan tu Binh co vi tri: 1

Lưu ý: Chỉ số các phần tử trong ArrayList cũng được bắt đầu từ 0.

3.5 Xóa phần tử trong ArrayList

Thao tác xóa phần tử trong ArrayList sẽ loại bỏ đi hoàn toàn phần tử đó, để xóa được phần tử trong ArrayList ta cần phải có giá trị của phần tử cần xóa sau đó gọi đến phương thức remove() – phương thức này nhận vào giá trị phần tử cần xóa khỏi ArrayList.

import java.util.*;  
public class Main{  
    public static void main(String args[]){  
    	//Khai bao ArrayList voi kieu String
        ArrayList<String> arrayList = new ArrayList<String>();  
        //Them phan tu vao ArrayList
        arrayList.add("An"); 
        arrayList.add("Binh"); 
        arrayList.add("Chinh"); 
        arrayList.add("Dung");   
        //Kiem tra phan tu trong ArrayList
        System.out.println("Phan tu co trong ArrayList la: \n" + arrayList);
        
        //Xoa phan tu Chinh va Dung trong ArrayList
        arrayList.remove("Chinh");  
        arrayList.remove("Dung");  
        //Kiem tra phan tu trong ArrayList sau khi xoa
        System.out.println("Phan tu co trong ArrayList sau khi xoa la: \n" + arrayList);
    }  
}

Kết quả:

Phan tu co trong ArrayList la: 
[An, Binh, Chinh, Dung]
Phan tu co trong ArrayList sau khi xoa la: 
[An, Binh]

4. Các phương thức của ArrayList trong Java

Trong các ví dụ trên, khi thao tác thêm phần tử vào ArrayList, duyệt các phần tử ArrayList, sắp xếp phần tử ArrayList, tìm kiếm phần tử ArrayList, xóa phần tử ArrayList …. chúng ta đã sử dụng các phương thức như: add(), sort(), contains(), indexOf(), remove()…tuy nhiên, lớp ArrayList này còn cung cấp thêm nhiều hơn các phương thức nữa. Các phương thức của ArrayList sẽ được đưa ra đầy đủ ở bảng dưới đây:

Phương thức Mô tả
void add(int index, E element) Thêm phần tử vào ArrayList tại vị trí index được chỉ định.
boolean add(E element) Thêm phần tử vào cuối ArrayList.
boolean addAll(Collection<? extends E> c) Nối tất cả các phần tử trong một Collection được chỉ định vào cuối ArrayList.
boolean addAll(int index, Collection<? extends E> c) Nối tất cả các phần tử trong một Collection được chỉ định vào vị trí index bắt đầu nối.
void clear() Xóa toàn bộ phần tử có trong ArrayList.
boolean equals(Object o) So sánh bằng nhau giữa một phần tử trong ArrayList và một đối tượng cần so sánh.
int hashcode() Trả về giá trị hash code của ArrayList.
get(int index) Lấy ra một phần tử trong ArrayList giựa vào chỉ số index của phần tử đó.
boolean isEmpty() Kiểm tra ArrayList có rỗng hay không?
int lastIndexOf(Object o) Lấy ra chỉ số index của phần tử cuối cùng nằm trong ArrayList.
Object[] toArray() Chuyển đổi các phần tử trong ArrayList về kiểu mảng.
boolean contains(Object o) Kiêm tra sự tồn tại của một phần tử trong ArrayList. Trả về True nếu phần tử kiểm tra tồn tại trong ArrayList, ngược lại trả về False.
boolean containsAll(Collection<?> c) Kiểm tra sự tồn tại của một Collection trong ArrayList. Trả về True nếu Collection thuộc ArrayList, ngược lại trả về False.
int indexOf(Object o) Trả về chỉ mục index của phần tử trong ArrayList dựa vào giá trị tương ứng.
remove(int index) Xóa đi phần tử trong ArrayList tại vị trí index.
boolean remove(Object o) Xóa đi phần tử trong ArrayList dựa vào giá trị phần tử cần xóa.
boolean removeAll(Collection<?> c) Xóa tất cả phần tử trong một Collection thuộc trong ArrayList.
void replaceAll(UnaryOperator<E> operator) Thay thế tất cả các phần tử trong ArrayList bằng phần tử được chỉ định.
void retainAll(Collection<?> c) Giữ lại tất cả các phần tử trong ArrayList với điều kiện các phần tử này thuộc trong có trong một Collection được chỉ định.
set(int index, E element) Thay đổi giá trị phần tử trong ArrayList tại vị trí index.
void sort(Comparator<? super E> c) Sắp xếp các phần tử trong ArrayList.
List<E> subList(int fromIndex, int toIndex) Lấy ra các phần tử bắt đầu từ vị trí index là fromIndex đến phần tử cuối cùng có vị trí index là toIndex trong ArrayList.
int size() Lấy ra số lượng phần tử có trong ArrayList.
Phương thức Mô tả
void add(int index, E element) Thêm phần tử vào ArrayList tại vị trí index được chỉ định.
boolean add(E element) Thêm phần tử vào cuối ArrayList.
boolean addAll(Collection<? extends E> c) Nối tất cả các phần tử trong một Collection được chỉ định vào cuối ArrayList.
boolean addAll(int index, Collection<? extends E> c) Nối tất cả các phần tử trong một Collection được chỉ định vào vị trí index bắt đầu nối.
void clear() Xóa toàn bộ phần tử có trong ArrayList.
boolean equals(Object o) So sánh bằng nhau giữa một phần tử trong ArrayList và một đối tượng cần so sánh.
int hashcode() Trả về giá trị hash code của ArrayList.
get(int index) Lấy ra một phần tử trong ArrayList giựa vào chỉ số index của phần tử đó.
boolean isEmpty() Kiểm tra ArrayList có rỗng hay không?
int lastIndexOf(Object o) Lấy ra chỉ số index của phần tử cuối cùng nằm trong ArrayList.
Object[] toArray() Chuyển đổi các phần tử trong ArrayList về kiểu mảng.
boolean contains(Object o) Kiêm tra sự tồn tại của một phần tử trong ArrayList. Trả về True nếu phần tử kiểm tra tồn tại trong ArrayList, ngược lại trả về False.
boolean containsAll(Collection<?> c) Kiểm tra sự tồn tại của một Collection trong ArrayList. Trả về True nếu Collection thuộc ArrayList, ngược lại trả về False.
int indexOf(Object o) Trả về chỉ mục index của phần tử trong ArrayList dựa vào giá trị tương ứng.
remove(int index) Xóa đi phần tử trong ArrayList tại vị trí index.
boolean remove(Object o) Xóa đi phần tử trong ArrayList dựa vào giá trị phần tử cần xóa.
boolean removeAll(Collection<?> c) Xóa tất cả phần tử trong một Collection thuộc trong ArrayList.
void replaceAll(UnaryOperator<E> operator) Thay thế tất cả các phần tử trong ArrayList bằng phần tử được chỉ định.
void retainAll(Collection<?> c) Giữ lại tất cả các phần tử trong ArrayList với điều kiện các phần tử này thuộc trong có trong một Collection được chỉ định.
set(int index, E element) Thay đổi giá trị phần tử trong ArrayList tại vị trí index.