실제 개발 과정에서 배열을 리스트로 변환하기 위해 asList를 자주 사용합니다. 이 방법은 사용하기 매우 편리하지만 asList 방법에는 몇 가지 결함이 있습니다.
8가지 기본형 배열을 리스트로 변환할 경우 좀 더 풍미있는 결함이 있습니다. 먼저 다음 프로그램을 살펴보겠습니다.
public static void main(String[] args) { int[] ints = {1,2,3,4,5}; List list = Arrays.asList(ints); System.out.println("list'size:" + list.size()); } ------------------------------------ outPut: list'size:1
프로그램의 실행 결과는 5가 아닙니다. 예상외입니다. 1. 무슨 일이에요? 먼저 소스 코드를 살펴보겠습니다.
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
asList에서 허용하는 매개변수는 일반 가변 길이입니다. 매개변수에 따르면 기본 데이터 유형은 스타일을 지정할 수 없습니다. 즉, 8가지 기본 유형을 asList의 매개변수로 사용할 수 없다는 뜻입니다. 일반 매개변수로 사용하려면 해당 패키징 유형을 사용해야 합니다. 그런데 이 경우에는 왜 오류가 없나요? 이 인스턴스는 int 유형의 배열을 매개변수로 사용하고 배열은 Java의 객체이므로 일반화될 수 있습니다. 따라서 이 예에서는 오류가 발생하지 않습니다. 예제에서는 전체 int 유형 배열을 일반 매개변수로 사용하므로 asList 변환 후에는 하나의 int 목록만 있게 됩니다. 다음과 같습니다:
public static void main(String[] args) { int[] ints = {1,2,3,4,5}; List list = Arrays.asList(ints); System.out.println("list 的类型:" + list.get(0).getClass()); System.out.println("list.get(0) == ints:" + list.get(0).equals(ints)); } -------------------------------------------- outPut: list 的类型:class [I list.get(0) == ints:true
이 연산 결과에서 목록의 요소가 다음과 같다는 것을 완전히 증명할 수 있습니다. 정수 배열. 이것을 이해하면 수정 방법이 한눈에 명확해집니다. int를 Integer로 변경하는 것입니다.
public static void main(String[] args) { Integer[] ints = {1,2,3,4,5}; List list = Arrays.asList(ints); System.out.println("list'size:" + list.size()); System.out.println("list.get(0) 的类型:" + list.get(0).getClass()); System.out.println("list.get(0) == ints[0]:" + list.get(0).equals(ints[0])); } ---------------------------------------- outPut: list'size:5 list.get(0) 的类型:class java.lang.Integer list.get(0) == ints[0]:true
> 기본 데이터 유형을 매개변수로 사용하지 마세요.
위의 예를 조금 더 수정하겠습니다.
public static void main(String[] args) { Integer[] ints = {1,2,3,4,5}; List list = Arrays.asList(ints); list.add(6); }
asList를 통해 int를 목록 카테고리로 변환한 후 add 메소드를 통해 요소를 추가하는 예제입니다. . 이 예는 이보다 더 간단할 수 없지만 실행 결과는 어떻습니까? 예상한 내용을 입력하세요.
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(Unknown Source) at java.util.AbstractList.add(Unknown Source) at com.chenssy.test.arrayList.AsListTest.main(AsListTest.java:10)
실행 결과에서 UnsupportedOperationException 예외가 발생합니다. 이는 목록이 다음을 수행함을 나타냅니다. 추가 방법을 지원하지 않습니다. 이것은 우리를 우울하게 만듭니다. 어떻게 목록이 add 메소드를 지원하지 않을 수 있습니까? jdk의 뇌가 막혔나요? asList의 소스 코드를 살펴보겠습니다.
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
asList가 매개변수를 수락한 후 직접 새 항목을 생성합니다. ArrayList는 여기로 가세요. 오류가 없어야겠죠? 걱정하지 마세요. 다음 내용을 읽어보세요.
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable{ private static final long serialVersionUID = -2764017481108945198L; private final E[] a; ArrayList(E[] array) { if (array==null) throw new NullPointerException(); a = array; } //................. }
이것은 ArrayList의 소스 코드입니다. 여기서부터 이 ArrayList는 java.util.ArrayList가 아니며 배열의 내부 클래스입니다. 이 내부 클래스는 size, toArray, get, set, indexOf를 제공하고 메소드를 포함하며 목록 결과를 변경하는 add 및 delete와 같은 메소드는 AbstractList 상위 클래스에서 상속됩니다. 동시에 이러한 메소드도 매우 이상합니다. UnsupportedOperationException 예외를 직접 발생시킵니다:
public boolean add(E e) { add(size(), e); return true; } public E set(int index, E element) { throw new UnsupportedOperationException(); } public void add(int index, E element) { throw new UnsupportedOperationException(); } public E remove(int index) { throw new UnsupportedOperationException(); }
이러한 코드를 통해 asList에서 반환한 목록을 볼 수 있습니다. 는 리스트를 가장한 리스트일 뿐 리스트의 기본 특성(가변 길이)이 없습니다. 목록은 변경할 수 없는 길이의 목록입니다. 반환된 목록은 전달된 매개변수 배열만큼만 길어질 수 있습니다. 그래서:
>
위는 Java 개선 장(36)의 내용이다. -----Java 컬렉션 세부 사항(2): 결함 asList 관련 내용을 더 보려면 PHP 중국어 웹사이트(www.php.cn)를 주목하세요!