Основное отличие состоит в том, что Collections.emptyList()
возвращает неизменный список, т. Е. Список, в который нельзя добавлять элементы. (То же относится и к List.of()
введенному в Java 9.)
В тех редких случаях , когда вы действительно хотите изменить возвращаемый список, Collections.emptyList()
и List.of()
, таким образом , не хороший выбор.
Я бы сказал, что возвращение неизменяемого списка совершенно нормально (и даже предпочтительным образом), если в контракте (документации) явно не указано иное.
Кроме того, emptyList()
может не создавать новый объект с каждым вызовом.
Реализации этого метода не должны создавать отдельный объект List для каждого вызова. Использование этого метода может иметь сравнимую стоимость с использованием одноименного поля. (В отличие от этого метода, поле не обеспечивает безопасность типов.)
Реализация emptyList
выглядит следующим образом:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Поэтому, если ваш метод (который возвращает пустой список) вызывается очень часто, этот подход может даже дать вам немного лучшую производительность как с точки зрения процессора, так и памяти.
Collections.emptyList()
подойдет ли, скажем так, проверка ошибок и тому подобное?NullPointerException
, вернувCollections.emptyList()
вместоnull
.Collections.emptyList()
является итеративным и возвращает длину, поэтому его можно использовать в циклах for без исключения.List.of()
?new ArrayList<>()
это также делает проектное решение ясным; элементы не будут добавлены в этот список.Начиная с Java 5.0, вы можете указать тип элемента в контейнере:
Я согласен с другими ответами, что для случаев, когда вы хотите вернуть пустой список, который остается пустым, вы должны использовать этот подход.
источник
List<Foo> list = Collections.emptyList()
Collections.emptyList
является неизменным, поэтому существует разница между двумя версиями, поэтому вы должны учитывать пользователей возвращаемого значения.Возврат
new ArrayList<Foo>
всегда создает новый экземпляр объекта, поэтому с ним связаны очень небольшие дополнительные расходы, которые могут дать вам повод для использованияCollections.emptyList
. Мне нравится использоватьemptyList
только потому, что это более читабельно.источник
Будьте осторожны, хотя. Если вы вернетесь,
Collections.emptyList()
а затем попытаетесь внести в него некоторые изменения, напримерadd()
или что-то в этом роде, у вас будетUnsupportedOperationException()
потому чтоCollections.emptyList()
возвращает неизменный объект.источник
Я хотел бы пойти с,
Collections.emptyList()
если возвращенный список не изменяется каким-либо образом (так как список является неизменным), в противном случае я бы пошел с вариантом 2.Преимущество
Collections.emptyList()
заключается в том, что каждый раз возвращается один и тот же статический экземпляр, поэтому создание экземпляра для каждого вызова не происходит.источник
Используйте Collections.emptyList (), если вы хотите убедиться, что возвращаемый список никогда не изменяется. Вот что возвращается при вызове emptyList ():
источник
Collections.emptyList()
строительства. Просмотр подробностей реализации (хотя, вероятно, не одинаковых на всех JVM) подтверждает, что это не так. @ Атул, из какой это JVM?Приведенные ответы подчеркивают тот факт, что
emptyList()
возвращает неизменное,List
но не дают альтернативы. КонструкторуArrayList(int initialCapacity)
особые случаи0
так возвращающиесяnew ArrayList<>(0)
вместоnew ArrayList<>()
также может быть жизнеспособным решением:[...]
(исходники из Java 1.8.0_72)
источник