[java] Arrays.asList ()에서 만든 목록의 remove ()에서 UnsupportedOperationException이 발생합니다.

컬렉션 c1<MyClass>과 배열이 a<MyClass>있습니다. 나는 컬렉션에 배열을 변환하려고 c2하고 할 c1.removeAll(c2),하지만이 발생합니다 UnsupportedOperationException. 나는 것을 발견 asList()배열 클래스 반환의 Arrays.ArrayList클래스와이 클래스는 상속 removeAll()에서 AbstractList()그 구현이 발생합니다 UnsupportedOperationException.

    Myclass la[] = getMyClass();
    Collection c = Arrays.asList(la);
    c.removeAll(thisAllreadyExistingMyClass);

요소를 제거하는 방법이 있습니까? 도와주세요



답변

Arrays.asListList배열 주위 에 래퍼를 반환합니다 . 이 래퍼는 크기가 고정되어 있으며 배열에 의해 직접 지원되며 이러한 호출 set은 배열을 수정하고 목록을 수정하는 다른 모든 메서드는 UnsupportedOperationException.

이 문제를 해결하려면 래퍼 목록의 내용을 복사하여 수정 가능한 새 목록을 만들어야합니다. 다음을 사용하는 ArrayList생성자를 사용하면 쉽습니다 Collection.

Collection c = new ArrayList(Arrays.asList(la));


답변

예,은 ( Arrays.asList(..)는) 확장하거나 축소 할 수없는 컬렉션입니다 (원래 배열이 지원하고 크기를 조정할 수 없기 때문입니다).

요소를 제거 new ArrayList(Arrays.asList(..)하려면 배열에서 직접 요소를 만들 거나 제거합니다 (효율성이 떨어지고 쓰기가 더 어렵습니다).


답변

이것이 Array.asList()작동 방식 입니다. 어레이에 의해 직접 지원되기 때문입니다. 완전히 수정 가능한 목록을 얻으려면 컬렉션을 직접 만든 컬렉션으로 복제해야합니다.

Collection c = new ArrayList(Arrays.asList(la))


답변