Java List là một interface có thứ tự, mở rộng từ Collection, cho phép chèn phần tử theo vị trí, truy cập bằng chỉ số và tìm kiếm phần tử trong list.

Java List
Một số điểm quan trọng về Java List:
- Java List interface là thành viên của Java Collections Framework.
- List cho phép thêm các phần tử trùng lặp.
- List cho phép có các phần tử
null. - List interface được bổ sung nhiều phương thức mặc định trong Java 8, ví dụ
replaceAll,sortvàspliterator. - Chỉ số của List bắt đầu từ 0, giống như mảng.
- List hỗ trợ Generics và nên được sử dụng khi có thể. Dùng Generics với Litong-quan-ve-java-listst sẽ tránh được lỗi
ClassCastExceptionkhi khởi chạy.
Biểu đồ lớp Java List
Java List interface mở rộng từ Collection, trong khi Collection tiếp tục mở rộng từ Iterable. Các lớp triển khai List phổ biến gồm ArrayList, LinkedList, Vector, Stack, CopyOnWriteArrayList. Ngoài ra, AbstractList cung cấp một triển khai khung xương để đơn giản hóa việc xây dựng List.

Java List class diagram
Các phương thức của Java List
Một số phương thức hữu ích của Java List:
int size(): trả về số phần tử trong list.boolean isEmpty(): kiểm tra list có rỗng hay không.boolean contains(Object o): trả về true nếu list chứa phần tử chỉ định.Iterator<E> iterator(): trả về một iterator để duyệt các phần tử theo đúng thứ tự.Object[] toArray(): trả về một mảng chứa tất cả phần tử của list.boolean add(E e): thêm phần tử vào cuối list.boolean remove(Object o): xóa lần xuất hiện đầu tiên của phần tử được chỉ định.boolean retainAll(Collection<?> c): chỉ giữ lại các phần tử có trong collection chỉ định.void clear(): xóa toàn bộ phần tử trong list.E get(int index): trả về phần tử tại vị trí chỉ định.E set(int index, E element): thay thế phần tử tại vị trí chỉ định bằng phần tử mới.ListIterator<E> listIterator(): trả về list iterator cho phép duyệt list.List<E> subList(int fromIndex, int toIndex): trả về một view của phần list trong khoảng chỉ định.
Một số phương thức mặc định được thêm vào List trong Java 8:
default void replaceAll(UnaryOperator<E> operator): thay thế mỗi phần tử bằng kết quả của operator.default void sort(Comparator<super E> c): sắp xếp list theo thứ tự do Comparator quy định.default Spliterator<E> spliterator(): tạo một Spliterator trên các phần tử trong list.
Chuyển Java Array sang List
Có thể dùng lớp Arrays để chuyển đổi một mảng thành list. Tuy nhiên không thể thực hiện các thay đổi cấu trúc trên list này, nếu làm sẽ ném ra ngoại lệ java.lang.UnsupportedOperationException. Cách tốt nhất là dùng vòng lặp for để tạo list từ mảng. Ví dụ:
package com.journaldev.examples;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayToList {
public static void main(String[] args) {
String[] vowels = {"a","e","i","o","u"};
List<String> vowelsList = Arrays.asList(vowels);
System.out.println(vowelsList);
// sử dụng vòng lặp for để sao chép phần tử từ mảng sang list, an toàn cho việc thay đổi list
List<String> myList = new ArrayList<>();
for(String s : vowels){
myList.add(s);
}
System.out.println(myList);
myList.clear();
}
}
Bạn có thể chọn bất kỳ phương pháp nào ở trên tùy theo yêu cầu của dự án.
Chuyển Java List sang Array
Ví dụ đơn giản minh họa cách chuyển đổi list sang array:
package com.journaldev.examples;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ListToArray {
public static void main(String[] args) {
List<String> letters = new ArrayList<String>();
// add example
letters.add("A");
letters.add("B");
letters.add("C");
//convert list to array
String[] strArray = new String[letters.size()];
strArray = letters.toArray(strArray);
System.out.println(Arrays.toString(strArray)); // "[A, B, C]"
}
}
Sắp xếp Java List
Có 2 cách để sắp xếp list. Có thể dùng lớp Collections cho sắp xếp tự nhiên, hoặc dùng phương thức sort() của List với Comparator tùy chỉnh. Ví dụ:
package com.journaldev.examples;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class ListSortExample {
public static void main(String[] args) {
List<Integer> ints = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 10; i++) ints.add(random.nextInt(1000));
// sắp xếp tự nhiên
Collections.sort(ints);
System.out.println("Natural Sorting: "+ints);
// sắp xếp đảo ngược
ints.sort((o1,o2) -> {return (o2-o1);});
System.out.println("Reverse Sorting: "+ints);
}
}
Dưới đây là một ví dụ kết quả. Vì sử dụng Random để sinh phần tử cho list nên kết quả sẽ khác nhau mỗi lần chạy.
Natural Sorting: [119, 273, 388, 450, 519, 672, 687, 801, 812, 939]
Reverse Sorting: [939, 812, 801, 687, 672, 519, 450, 388, 273, 119]
Các thao tác Java List phổ biến
Một số thao tác phổ biến trên Java List là add, remove, set, clear, size… Ví dụ:
package com.journaldev.examples;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ListExample {
public static void main(String args[]) {
List<String> vowels= new ArrayList<String>();
//add example
vowels.add("A");
vowels.add("I");
//insert example
vowels.add(1,"E");
System.out.println(vowels);
List<String> list = new ArrayList<String>();
list.add("O");list.add("U");
//append list
vowels.addAll(list);
System.out.println(vowels);
//clear example
list.clear();
//size example
System.out.println("letters list size = "+vowels.size());
//set example
vowels.set(2, "E");
System.out.println(vowels);
//subList example
vowels.clear();vowels.add("E"); vowels.add("E");vowels.add("I"); vowels.add("O");
list = vowels.subList(0, 2);
System.out.println("letters = "+vowels+", list = "+list);
vowels.set(0, "A");
System.out.println("letters = "+vowels+", list = "+list);
list.add("U");
System.out.println("letters = "+vowels+", list = "+list);
}
}
Kết quả của chương trình ví dụ Java List ở trên là:
[A, E, I]
[A, E, I, O, U]
letters list size = 5
[A, E, E, O, U]
letters = [E, E, I, O], list = [E, E]
letters = [A, E, I, O], list = [A, E]
letters = [A, E, U, I, O], list = [A, E, U]
Java List iterator
Ví dụ duyệt list trong Java:
package com.journaldev.examples;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListIteratorExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for(int i=0; i<5; i++) list.add(i);
Iterator<Integer> iterator = list.iterator();
//simple iteration
while(iterator.hasNext()){
int i = (int) iterator.next();
System.out.print(i + ", ");
}
System.out.println("\\n"+list);
//modification of list using iterator
iterator = list.iterator();
while(iterator.hasNext()){
int x = (int) iterator.next();
if(x%2 ==0) iterator.remove();
}
System.out.println(list);
//changing list structure while iterating
iterator = list.iterator();
while(iterator.hasNext()){
int x = (int) iterator.next(); //ConcurrentModificationException
if(x==1) list.add(10);
}
}
}
Kết quả ví dụ duyệt list bằng iterator
0, 1, 2, 3, 4,
[0, 1, 2, 3, 4]
[1, 3]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at com.journaldev.examples.ListIteratorExample.main(ListIteratorExample.java:34)
Trên đây là phần tổng hợp nhanh về List trong Java. Hy vọng các ví dụ này sẽ giúp bạn bắt đầu làm việc hiệu quả với List trong lập trình Java.