(стара нитка, але всього 2 центи, як жодна згадка про Гуаву чи інші мочки та деякі інші деталі)
Якщо можете, використовуйте Гуаву
Варто вказати шлях Гуави, який значно спрощує ці шенагігани:
Використання
Для незмінного списку
Використовуйте ImmutableList
клас та його of()
та copyOf()
фабричні методи (елементи не можуть бути нульовими) :
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
Для змінного списку
Використовуйте Lists
клас та його newArrayList()
заводські методи:
List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
Будь ласка, зверніть увагу на подібні методи для інших структур даних в інших класах, наприклад в Sets
.
Головною привабливістю може бути зменшення безладу за рахунок дженериків для безпеки типу, як використання гуави заводських методів дозволяє виводити типи більшу частину часу. Однак цей аргумент тримає менше води, оскільки Java 7 приїхала з новим оператором алмазів.
Але це не єдина причина (а Java 7 ще не скрізь): скорочений синтаксис також дуже зручний, а ініціалізатори методів, як видно вище, дозволяють писати більш виразний код. Ви робите за один дзвінок у Guava, що займає 2 з поточними колекціями Java.
Якщо ви не можете ...
Для незмінного списку
Використовуйте Arrays
клас JDK та його asList()
заводський метод, обгорнутий Collections.unmodifiableList()
:
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
Зауважте, що повернутий тип для asList()
- це List
використання конкретної ArrayList
реалізації, але це НЕ java.util.ArrayList
. Це внутрішній тип, який імітує, ArrayList
але фактично безпосередньо посилається на пройдений масив і змушує його "записувати через" (модифікації відображаються в масиві).
Він забороняє модифікації за допомогою деяких List
методів API шляхом простого розширення AbstractList
(таким чином, додавання або видалення елементів не підтримується), однак це дозволяє викликам set()
перезаписати елементи. Таким чином, цей список не є справді незмінним, і заклик до нього asList()
слід завершити Collections.unmodifiableList()
.
Дивіться наступний крок, якщо вам потрібен список, що змінюється.
Для змінного списку
Те саме, що вище, але завершено фактичним java.util.ArrayList
:
List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+
Для навчальних цілей: Посібник з хорошого стилю
// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);
for (final T s : array) {
l.add(s);
}
return (l);
}
// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}