1. List trong Java là gì?

List trong Java là một Interface trong bộ collection Java, nó được sử dụng để lưu trữ tập hợp các phần tử (hay các đối tượng) có thứ tự trong đó các giá trị trùng lặp hoàn toàn có thể được lưu trữ trong một List. Ngoài ra, một List còn có thể được phép sử dụng để lưu trữ một hoặc nhiều giá trị Null làm phần tử của nó.

Bởi vì List là kiểu lưu trữ có thứ tự, thế nên nó cho phép chúng ta có thể truy cập vị trí của các phần tử có trong List bằng chỉ mục (index). Việc truy cập vào các phần tử trong List thông qua chỉ mục giúp ta dễ dàng thao tác với List hơn, trên thực tế List Interface đã cung cấp sẵn cho chúng ta rất nhiều các phương thức để thực hiện các thao tác với phần tử bên trong nó, ví dụ như thao tác: chèn, sửa, xóa, tìm kiếm…

Chúng ta hoàn toàn có thể tìm thấy List trong thư viện java.util và để sử dụng được kiểu List trong Java ta chỉ cần nhập thư viện: import java.util.*;

2. Khai báo List trong Java

Để sử dụng được List trong Java, chúng ta chỉ cần khai báo (khởi tạo) một lớp có tên là List(). Khi khởi tạo một đối tượng List mới, ta có thể khởi tạo List và triển khai Interface List theo các lớp là ArrayList(), LinkedList(), Stack()Vector().

Trong đó, hai lớp thường được sử dụng để triển khai khi khởi tạo một List mới đó là: lớp ArrayList() và lớp LinkedList() được sử dụng rộng rãi trong lập trình Java. Kể từ phiên bản Java 5, lớp Vector() đã không còn được dùng để triển khai một List trong Java.

Dưới đây là các ví dụ khởi tạo một List mới sử dụng lớp ArrayList() và lớp LinkedList() để triển khai List đó:

//Khoi tao mot List voi kieu String su dung ArrayList  
List<String> list = new ArrayList<String>();  
  
//Khoi tao mot List voi kieu Integer su dung ArrayList  
List<Integer> list = new ArrayList<Integer>();  
  
//Khoi tao mot List voi kieu Home su dung ArrayList  
List<Home> list = new ArrayList<Home>();  
  
//Khoi tao mot List voi kieu String su dung LinkedList  
List<String> list=new LinkedList<String>();

Trong các chương trình của chúng tôi, một List mới khi được khởi tạo sẽ được triển khai theo lớp ArrayList(). Như trong ví dụ dưới đây, chúng ta sẽ cùng khởi tạo một List mới và thực hiện kiểm tra số lượng phần tử bên trong List đó, cũng như kiểm tra List có rỗng hay không?

import java.util.*;  
public class Main{  
    public static void main(String args[]){  
        //Tao mot list voi kieu String su dung ArrayList 
        List<String> list = new ArrayList<String>();  
        //Kiem tra list vua tao co rong hay khong?
        boolean result = list.isEmpty();
        System.out.println("List vua tao co rong hay khong? \n" + result); 
        //Kiem tra phan tu trong list
        System.out.println("Phan tu co trong List la: \n" + list); 
    }
}

Kết quả:

List vua tao co rong hay khong? 
true
Phan tu co trong List la: 
[]

Từ kết quả trên, ta có thể thấy rằng một List mới khi khởi tạo sẽ là một List rỗng. Các phần tử trong một List sẽ được lưu trữ bên trong cặp dấu ngoặc vuông [ ].

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

Có rất nhiều thao tác với List trong Java, các thao tác đó chủ yếu là việc: Thêm phần tử vào List, get và set phần tử trong List, chuyển đổi mảng thành kiểu List, sắp xếp List, duyệt các phần tử trong List, chuyển đổi List thành một mảng…Chúng ta sẽ cùng nhau thực hiện các thao tác căn bản trên với các ví dụ dưới đây.

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

Để thực hiện việc thêm phần tử vào trong một List, trước tiên ta cần khai báo List đó. Ta có thể triển khai List đó thông qua việc sử dụng lớp ArrayList() tiếp theo, ta chỉ cần gọi đến phương thức List.add() và truyền vào phần tử cần thêm vào List như bên dưới đây:

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

Kết quả:

List vua tao co rong hay khong? 
true
Phan tu co trong List la: 
[]
List sau khi them phan tu co rong khong? 
false
Phan tu co trong List sau khi them la: 
[Oto, XeMay, TauHoa, MayBay]

3.2 Get và set phần tử trong List trong Java

Phương thức List.get() là hành động được dùng để lấy ra một phần tử có trong List. Việc lấy ra phần tử này sẽ thông qua chỉ mục của phần tử cần lấy (hay index của phần tử đó). Ta chỉ cần truyền vào phương thức List.get() một index của phần tử cần lấy thì có thể lấy ra giá trị phần tử tại vị trí index thuộc trong một List.

Phương thức List.set() là hành động được dùng để thay đổi một phần tử có trong ListViệc thay đổi phần tử này cũng được thực hiện thông qua chỉ mục của phần tử cần cập nhật giá trị (hay index của phần tử đó). Ta cần truyền vào phương thức List.set() một tham số chỉ mục index và giá trị mới cần cập nhật tại index đó, khi đó ta sẽ có thể thay đổi được giá trị tại vị trí index trong List.

import java.util.*;  
public class Main{  
    public static void main(String args[]){  
        //Tao mot list voi kieu String su dung ArrayList 
        List<String> list = new ArrayList<String>();  
        //Them phan tu vao trong List
        list.add("Oto");//index = 0  
        list.add("XeMay");//index = 1
        list.add("TauHoa");// index = 2
        list.add("MayBay");//index = 2  
        //Hien thi phan tu trong List
        System.out.println("Phan tu trong List ban dau la: \n" + list);
        //Lay gia tri cua phan tu co index bang 1
        System.out.println("Phan tu tai index = 1 la: " + list.get(1));
        //Thay doi gia tri cua phan tu co index bang 1 bang gia tri XeDap
        list.set(1,"XeDap");
        //List sau khi thay doi
        System.out.println("List sau khi thay doi la: \n" + list);
    }
}

Kết quả:

Phan tu trong List ban dau la: 
[Oto, XeMay, TauHoa, MayBay]
Phan tu tai index = 1 la: XeMay
List sau khi thay doi la: 
[Oto, XeDap, TauHoa, MayBay]

3.3 Chuyển mảng thành List trong Java

Chúng ta có thể chuyển đổi mảng thành List bằng cách duyệt qua mảng và thêm từng phần tử vào List đó bằng cách sử dụng phương thức List.add().

import java.util.*;  
public class Main{  
    public static void main(String args[]){  
        //Tao mang co 4 phan tu 
        String[] array={"Oto", "XeMay", "TauHoa", "MayBay"};  
        System.out.println("Hien thi phan tu mang: "+Arrays.toString(array));  
        //Chuyen tren thanh List thong qua vong lap va phuong thuc List.add()
        List<String> list = new ArrayList<String>();  
        //Duyet qua cac phan tu trong mang va them vao List vua tao
        for(String item:array){  
            list.add(item);  
        }  
        System.out.println("Hien thi phan tu trong List: "+list);  
    }  
}

Kết quả:

Hien thi phan tu mang: [Oto, XeMay, TauHoa, MayBay]
Hien thi phan tu trong List: [Oto, XeMay, TauHoa, MayBay]

3.4 Sắp xếp List trong Java

Có nhiều cách khác nhau để sắp xếp một List, ở đây chúng ta sẽ sử dụng phương thức Collections.sort() để sắp xếp phần tử bên trong List.

import java.util.*;  
class SortArrayList{  
    public static void main(String args[]){  
        //Khoi tao List1 String
        List<String> list1 = new ArrayList<String>();  
        list1.add("Oto");  
        list1.add("XeMay");  
        list1.add("TauHoa");  
        list1.add("MayBay");  
        //Sap xep list1 bang phuong thuc sort()
        Collections.sort(list1);  
        //Duyet qua cac phan tu trong List sau khi sap xep
        System.out.println("List1 sau khi duoc sap xep la: ");  
        for(String item:list1){
        	System.out.println(item);  
        }  
          
        //Khoi tao List2 voi kieu Integer
        List<Integer> list2 = new ArrayList<Integer>();  
        list2.add(99);  
        list2.add(77);  
        list2.add(88);  
        list2.add(66);  
        //Sap xep list2 bang phuong thuc sort()
        Collections.sort(list2);  
        //Duyet qua cac phan tu trong List sau khi sap xep
        System.out.println("List2 sau khi duoc sap xep la: ");  
        for(Integer number:list2){
            System.out.println(number);  
        }
    }  
}

Kết quả:

List1 sau khi duoc sap xep la: 
MayBay
Oto
TauHoa
XeMay
List2 sau khi duoc sap xep la: 
66
77
88
99

3.5 Duyệt các phần tử List trong Java

Có 2 cách để thực hiện duyệt qua các phần tử có trong một List đó là:

  • Sử dụng vòng lặp for thông thường
  • Sử dụng List Iterator

Ví dụ đầu tiên, chúng ta cùng sử dụng vòng lặp for thông thường để duyệt qua các phần tử trong một List như sau:

import java.util.*;  
class SortArrayList{  
    public static void main(String args[]){  
        //Khoi tao list voi kieu String
        List<String> list = new ArrayList<String>();  
        list.add("Oto");  
        list.add("XeMay");  
        list.add("TauHoa");  
        list.add("MayBay");   
        //Duyet qua cac phan tu trong List bang vong lap for
        System.out.println("Duyet phan tu trong List: ");  
        for(String item:list){
            System.out.println(item);  
        }
    }  
}

Kết quả:

Duyet phan tu trong List: 
Oto
XeMay
TauHoa
MayBay

Ví dụ tiếp theo, chúng ta sẽ sử dụng List Iterator để thực hiện duyệt qua các phần tử có trong một List như sau:

import java.util.*;  
class SortArrayList{  
    public static void main(String args[]){  
        //Khoi tao list voi kieu String
        List<String> list = new ArrayList<String>();  
        list.add("Oto");  
        list.add("XeMay");  
        list.add("TauHoa");  
        list.add("MayBay");   
        //Duyet qua cac phan tu trong List bang doi tuong listIterator
        //Khoi tao doi tuong ListIterator
        ListIterator<String> itr = list.listIterator();    
        System.out.println("Duyet phan tu trong List:");    
        while(itr.hasNext()){
            //Duyet den phan tu tiep theo trong List
            System.out.println("index: "+itr.nextIndex()+" value: "+itr.next()); 
        }    
    }  
}

Kết quả:

Duyet phan tu trong List:
index: 0 value: Oto
index: 1 value: XeMay
index: 2 value: TauHoa
index: 3 value: MayBay

3.6 Chuyển List thành mảng trong Java

Chúng ta có thể chuyển đổi một List thành một mảng bằng cách gọi phương thức List.toArray() mà không cần sử dụng đến bất kỳ vòng lặp for nào. Như ví dụ dưới đây, ta sẽ thực hiện chuyển các phần tử có trong List có kiểu String về mảng lưu trữ String như sau:

import java.util.*;  
class SortArrayList{  
    public static void main(String args[]){  
        //Khoi tao list voi kieu String
        List<String> list = new ArrayList<String>();  
        list.add("Oto");  
        list.add("XeMay");  
        list.add("TauHoa");  
        list.add("MayBay");  
        //Hien thi phan tu trong List
        System.out.println("Hien thi phan tu trong List: "+list);
        //Tao mang array voi cac phan tu duoc chuyen doi trong List thong qua list.toArray()
        String[] array = list.toArray(new String[list.size()]);  
        //Hien thi phan tu trong mang
        System.out.println("Hien thi phan tu mang: "+Arrays.toString(array));
    }  
}

Kết quả:

Hien thi phan tu trong List: [Oto, XeMay, TauHoa, MayBay]
Hien thi phan tu mang: [Oto, XeMay, TauHoa, MayBay]

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

Thông qua các thao tác trên, chúng ta đã làm quen khá nhiều với các phương thức của List trong Java như: List.add(), List.get(), List.set(), List.toArray().…tuy nhiên, vẫn còn rất nhiều các phương thức khác được hỗ trợ cho kiểu List. Các phương thức này được liệt kê ở bên dưới bảng sau:

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