Java에서 array를 List로 바꾸려면 어떻게 해야될까?

for문을 쓰는것이 당연하지만 왠지 복잡해 보이고..

Arrays.asList가 List를 리턴한다. 간단해 보이므로 이걸쓰자.

 

하지만 잘 살펴보지 않으면 여기에 함정이 있다.

다음 코드를 살펴보자.

 

Integer[] arr = new Integer[]{1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(arr);
list.add(6);
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.base/java.util.AbstractList.add(AbstractList.java:153)
	at java.base/java.util.AbstractList.add(AbstractList.java:111)
	at ArrayAsList.main(ArrayAsList.java:10)

흠..List인데 add가 안된다?

 

Arrays.asList 구현을 보자.

public static <T> List<T> asList(T... a) {
	return new ArrayList<>(a);
}

ArrayList리턴인데 머지..?

 

하지만 이건 java.util.ArrayList 가 아니다.(머여그럼)

바로 밑에 코드를 보면 Arrays 안에 private static 으로 구현되어있다. 생성자로 array를 받고 전역변수로 array로 관리한다.

 

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) {
            a = Objects.requireNonNull(array);
        }
        ...
 }

 

그리고 add 메소드가 구현이 안되어있다. AbstractList 로 따라가다 보면 다음과 같이 UnsupportedOperationException을 발생시키는걸 볼 수 있다.

public void add(int index, E element) {
	throw new UnsupportedOperationException();
}

Arrays.asList 에서 나오는 결과로는 동적 List를 만들 수 없다. 

 

동적 List로 만들고 싶다면 오브젝트를 생성하여 반복문으로 새로 값을 할당해야 한다.

'Java' 카테고리의 다른 글

[Java] Wrapper 클래스 Cache  (0) 2020.06.18
[Java] Java에서 Map 관련 Iterate(반복문) 방법  (0) 2016.11.10

+ Recent posts