Collections.emptyList () 대 새 인스턴스
실제로, 더 나은처럼 빈 목록을 반환하는 이 :
return Collections.emptyList();
또는 이렇게 :
return new ArrayList<Foo>();
아니면 이것이 반환 된 목록으로 무엇을 할 것인지에 전적으로 의존합니까?
가장 큰 차이점은 변경 불가능한 목록, 즉 요소를 추가 할 수없는 목록을 Collections.emptyList()
반환한다는 것 입니다. ( Java 9에 도입 된 것과 동일합니다. )List.of()
당신이 드문 경우 않는 반환 된 목록을 수정하려면, 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()
하거나 그런 떨어지게, U는 것 UnsupportedOperationException()
때문에 Collections.emptyList()
돌아 불변의 객체를.
나는 함께 갈 것 Collections.emptyList()
그렇지 않으면 내가 옵션 2로 갈 것, 반환 된리스트 (목록은 불변으로) 어떤 식 으로든 수정되지 않을 경우.
이점은 Collections.emptyList()
매번 동일한 정적 인스턴스가 리턴되므로 각 호출에 대해 인스턴스 작성이 발생하지 않는다는 것입니다.
리턴 된 목록이 수정되지 않도록하려면 Collections.emptyList ()를 사용하십시오. 이것은 emptyList ()를 호출 할 때 반환되는 것입니다.
/**
* The empty list (immutable).
*/
public static final List EMPTY_LIST = new 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 소스)
참고 URL : https://stackoverflow.com/questions/5552258/collections-emptylist-vs-new-instance
'IT story' 카테고리의 다른 글
(lambda) 함수 클로저는 무엇을 캡처합니까? (0) | 2020.04.17 |
---|---|
CS0120 : 비 정적 필드, 메서드 또는 속성 'foo'에 개체 참조가 필요합니다. (0) | 2020.04.17 |
Twitter Bootstrap 3의 IE8 문제 (0) | 2020.04.17 |
jquery Ajax 웹 서비스에 JSON 게시 (0) | 2020.04.17 |
Markdown을 사용하여 GitHub 위키에서 이미지 크기 조정 (0) | 2020.04.17 |