programing

Collections.emptyList()와 새 인스턴스 비교

coolbiz 2022. 7. 3. 18:03
반응형

Collections.emptyList()와 새 인스턴스 비교

실제로는 다음과 같이 빈 목록을 반환하는 것이 좋습니까?

return Collections.emptyList();

또는 다음과 같이 합니다.

return new ArrayList<Foo>();

아니면 반환된 목록을 어떻게 처리하느냐에 따라 완전히 달라지는 것입니까?

주요 차이점은 는 불변의 목록, 즉 요소를 추가할 수 없는 목록을 반환한다는 것입니다(Java 9에서 도입된 목록도 마찬가지입니다).

드물게 반환된 목록을 수정해야 하는 경우,Collections.emptyList()그리고.List.of()따라서 좋은 선택이 아닙니다.

계약서(문서)에 명시적으로 다르게 기재되어 있지 않은 한 불변의 리스트를 반환하는 것은 문제없다고 생각합니다.


게다가.emptyList() 는, 각 콜에 대해서 새로운 오브젝트를 작성하지 않는 경우가 있습니다.

이 메서드의 구현에서는 콜마다 개별 List 객체를 작성할 필요가 없습니다.이 방법을 사용하면 같은 이름의 필드를 사용하는 것과 같은 비용이 들 수 있습니다(이 방법과 달리 이 필드는 유형의 안전성을 제공하지 않습니다).

의 실장emptyList는 다음과 같습니다.

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

따라서 (빈 목록을 반환하는) 메서드가 자주 호출되는 경우 이 방법을 사용하면 CPU와 메모리 모두 성능이 약간 향상될 수 있습니다.

Java 5.0부터는 컨테이너 내의 요소 유형을 지정할 수 있습니다.

Collections.<Foo>emptyList()

빈 목록을 반환할 경우 이 방법을 사용해야 한다는 다른 답변에 동의합니다.

Collections.emptyList는 불변하기 때문에 두 버전 사이에 차이가 있기 때문에 반환된 값의 사용자를 고려해야 합니다.

돌아오는new ArrayList<Foo>항상 오브젝트의 새 인스턴스를 생성하기 때문에 오브젝트와 관련된 비용이 매우 적게 들기 때문에 사용하는 이유가 있을 수 있습니다.Collections.emptyList사용하는 것을 좋아합니다.emptyList더 읽기 쉽다는 이유만으로요

그래도 조심해.돌아오면Collections.emptyList()그런 다음 그걸 이용해서 변화를 시도해보죠.add()그런 식으로 하면, 당신은 그 일을 하게 될 것이다.UnsupportedOperationException()왜냐면Collections.emptyList()변경할 수 없는 개체를 반환합니다.

같이 가고 싶다Collections.emptyList()(목록이 불변하기 때문에) 반환된 리스트가 수정되지 않으면 옵션2로 하겠습니다.

의 이점Collections.emptyList()매번 같은 스태틱인스턴스가 반환되기 때문에 콜마다 인스턴스가 작성되지 않습니다.

은, 「중요한 것은…」이라는 하고 있다.라는 사실을 강조한다.emptyList()의 「」를 한다.List츠키노 ★★★★★★★★★★★★★★★★★★」ArrayList(int initialCapacity)한 경우0 돌아온다new ArrayList<>(0)new ArrayList<>()실현 가능한 솔루션이 될 수도 있습니다.

/**
 * Shared empty array instance used for empty instances.
 */
private static final Object[] EMPTY_ELEMENTDATA = {};

[...]

/**
 * Constructs an empty list with the specified initial capacity.
 *
 * @param  initialCapacity  the initial capacity of the list
 * @throws IllegalArgumentException if the specified initial capacity
 *         is negative
 */
public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}

(Java 1.8.0_72로부터의 소스)

Collections.emptyList()반환된 목록이 변경되지 않도록 하려면 이 옵션을 클릭합니다.

은, 전화했을 입니다.emptyList():

/**
 * The empty list (immutable). 
 */
public static final List EMPTY_LIST = new EmptyList();

언급URL : https://stackoverflow.com/questions/5552258/collections-emptylist-vs-new-instance

반응형