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
'programing' 카테고리의 다른 글
Linux 개발 프로젝트를 위한 Clang vs GCC (0) | 2022.07.03 |
---|---|
Java Result 결과가 있는지 확인하는 방법을 설정합니다. (0) | 2022.07.03 |
사용하지 않는 기능은 최적화됩니까? (0) | 2022.07.03 |
v-bind에서 Vuex 액세스 (0) | 2022.07.02 |
정적 초기화 코드 블록과 비정적 초기화 코드 블록의 차이점은 무엇입니까? (0) | 2022.07.02 |