>Java >java지도 시간 >Java 개선 장(36) -----Java 컬렉션 세부 사항(2): asList의 결함

Java 개선 장(36) -----Java 컬렉션 세부 사항(2): asList의 결함

黄舟
黄舟원래의
2017-02-11 10:33:481397검색

실제 개발 과정에서 배열을 리스트로 변환하기 위해 asList를 자주 사용합니다. 이 방법은 사용하기 매우 편리하지만 asList 방법에는 몇 가지 결함이 있습니다.

1. 기본 데이터형 배열을 리스트로 사용하지 마세요

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&#39;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&#39;size:5
    list.get(0) 的类型:class java.lang.Integer
    list.get(0) == ints[0]:true

> 기본 데이터 유형을 매개변수로 사용하지 마세요.

2. asList에 의해 생성된 목록은 작동할 수 없습니다.

위의 예를 조금 더 수정하겠습니다.

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)를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.