답변:
가장 큰 차이점은 변경 불가능한 목록, 즉 요소를 추가 할 수없는 목록을 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와 메모리 측면에서 성능이 약간 향상 될 수 있습니다.
NullPointerException
에 리턴하여 얻을 수 없습니다 . Collections.emptyList()
null
Collections.emptyList()
반복 가능하고 길이를 리턴하므로 예외가 발생하지 않고 for 루프에서 사용될 수 있습니다.
new ArrayList<>()
디자인 결정 과 비교하면 분명하다. 요소는이 목록에 추가되지 않습니다.
Java 5.0부터 컨테이너에 요소 유형을 지정할 수 있습니다.
Collections.<Foo>emptyList()
비어있는 빈 목록을 반환하려는 경우이 방법을 사용해야한다는 다른 응답과 동의합니다.
List<Foo> list = Collections.emptyList()
그래도 조심하십시오. 당신이 돌아 오면 Collections.emptyList()
한 후이 좋아하는 몇 가지 변경을하려고 add()
하거나 그런 떨어지게, U는 것 UnsupportedOperationException()
때문에 Collections.emptyList()
돌아 불변의 객체를.
리턴 된 목록이 수정되지 않도록하려면 Collections.emptyList ()를 사용하십시오. 이것은 emptyList ()를 호출 할 때 반환되는 것입니다.
/**
* The empty list (immutable).
*/
public static final List EMPTY_LIST = new EmptyList();
Collections.emptyList()
에 건설 비용이 있는지 알아 보려고 여기에 도착했습니다 . 구현 세부 정보를 보면 (모든 JVM에서 동일하지는 않지만) 그렇지 않다는 것을 확인합니다. @Atul, 이것은 어느 JVM의 것입니까?
주어진 답변은 불변성을 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()
오류 확인 등에 더 적합할까요?