Rất nhiều người mới bắt đầu nhầm lẫn giữa khái niệm phương thức Arrays.asList() với cấu trúc dữ liệu ArrayList. Mặc dù chúng có thể trông và âm thanh tương tự nhau, nhưng hai cái này hoàn toàn khác nhau khi thực hiện. Trong bài đăng này, chúng tôi sẽ đề cập đến cách sử dụng cơ bản của phương thức Arrays.asList() và sẽ giải quyết một số nhầm lẫn phổ biến liên quan đến nó.
Tại sao Arrays.asList() được sử dụng?
Nếu bạn có một Mảng mà bạn cần biến thành một danh sách thì java.util.Arrays cung cấp một trình bao bọc Arrays.asList() để phục vụ mục đích này. Nói một cách đơn giản, phương thức này lấy một mảng làm tham số và trả về một danh sách. Các phần chính của API nền tảng Java đã được phát triển trước khi khung bộ sưu tập được giới thiệu. Vì vậy, đôi khi, bạn có thể cần dịch giữa các mảng truyền thống và các bộ sưu tập hiện đại hơn. Chức năng này phục vụ như một liên kết giữa Bộ sưu tập và API dựa trên mảng.
Ví dụ
Hãy xem ví dụ sau:
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
public class ArraysAsListDemo {
public static void main(String[] args) {
String[] teamMembers = {"Amanda", "Loren", "Keith"};
// using aslist() method
List teamList = Arrays.asList(teamMembers);
System.out.println("List : " + teamList);
HashSet teamHashSet = new HashSet<>(Arrays.asList(teamMembers));
System.out.println("HashSet : " + teamHashSet);
}
}
Đầu ra:
Danh sách : [Amanda, Loren, Keith]
HashSet : [Keith, Loren, Amanda] // HashSet không duy trì trật tự
Arrays.asList() và ArrayList khác nhau như thế nào?
Khi bạn gọi phương thức Arrays.asList() trên một mảng, đối tượng được trả về không phải là ArrayList (Triển khai mảng có thể thay đổi kích thước của giao diện Danh sách ). Nó là một đối tượng dạng xem với các phương thức get() và set() truy cập vào mảng bên dưới. Tất cả các phương thức sẽ thay đổi kích thước của mảng, chẳng hạn như add() hoặc remove() của trình vòng lặp được liên kết sẽ đưa ra một ngoại lệ UnsupportedOperationException . Lý do chương trình java biên dịch thành công nhưng đưa ra Ngoại lệ thời gian chạy là do rõ ràng, một "Danh sách" được trả về do kết quả củaArrays.asList() . Trường hợp tất cả các hoạt động thêm/xóa được cho phép. Nhưng vì, cấu trúc dữ liệu cơ bản là một “mảng” không thể thay đổi kích thước , do đó, một ngoại lệ được đưa ra trong thời gian chạy. Đây là một đoạn cho thấy nó trông như thế nào:
import java.util.Arrays;
import java.util.List;
public class ArraysAsListDemo {
public static void main(String[] args) {
Integer[] diceRoll = new Integer[6];
//using aslist() method
List diceRollList = Arrays.asList(diceRoll);
System.out.println(diceRollList);
// using getters and setters to randomly access the list
diceRollList.set(5, 6);
diceRollList.set(0, 1);
System.out.println(diceRollList.get(5));
System.out.println(diceRollList.get(1));
System.out.println(diceRollList);
diceRollList.add(7); // Add a new Integer to the list
}
}
Đầu ra:
[null, null, null, null, null, null]
6
null
[1, null, null, null, null, 6]
Ngoại lệ trong luồng "chính" java.lang.UnsupportedOperationException
tại java.util.AbstractList.add(AbstractList. java:148)
tại java.util.AbstractList.add(AbstractList.java:108)
tại ArraysAsListDemo.main(ArraysAsListDemo.java:20)
Ví dụ sử dụng phương thức asList()
Kể từ Java SE 5.0, phương thức asList() được khai báo là có số lượng đối số thay đổi. Thay vì truyền một mảng, bạn cũng có thể truyền các phần tử riêng lẻ. Ví dụ:
import java.util.Arrays;
import java.util.List;
public class ArraysAsListDemo {
public static void main(String[] args) {
List seasons = Arrays.asList("winter", "summer", "spring", "fall");
List odds = Arrays.asList(1, 3, 5, 7, 9);
System.out.println(seasons);
System.out.println(odds);
}
}
Đầu ra:
[đông, hạ, xuân, thu]
[1, 3, 5, 7, 9]
GO TO FULL VERSION