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 |