Відповіді:
Основна відмінність полягає в тому, що Collections.emptyList()
повертає незмінний список, тобто список, до якого ви не можете додати елементи. (Те саме стосується List.of()
введеного в Java 9.)
У тих рідкісних випадках , коли ви дійсно хочете змінити повертається список, Collections.emptyList()
і List.of()
, таким чином , НЕ хороший вибір.
Я б сказав, що повернення непорушного списку є прекрасним (і навіть кращим способом) до тих пір, поки в договорі (документації) прямо не зазначено інше.
Крім того, emptyList()
може не створюватися новий об'єкт при кожному виклику.
Реалізація цього методу не потребує створення окремого списку об'єктів для кожного виклику. Використання цього методу, швидше за все, матиме порівнянні витрати з використанням поля з назвою, що називається. (На відміну від цього методу, поле не забезпечує безпеку типу.)
Реалізація emptyList
виглядає наступним чином:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Отже, якщо ваш метод (який повертає порожній список) називається дуже часто, такий підхід може навіть дати вам трохи кращі показники як процесора, так і пам'яті.
NullPointerException
, повернувшись Collections.emptyList()
замість null
.
Collections.emptyList()
є ітерабельним і повертає довжину, тому його можна використовувати для циклів, не виключаючи викидання.
new ArrayList<>()
це також робить чітким рішення дизайну; елементи не будуть додані до цього списку.
Починаючи з Java 5.0, ви можете вказати тип елемента в контейнері:
Collections.<Foo>emptyList()
Я погоджуюся з іншими відповідями, що у випадках, коли ви хочете повернути порожній список, який залишається порожнім, ви повинні використовувати цей підхід.
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 ():
/**
* 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()
більше підходить, скажімо, перевірка помилок тощо?