(старая тема, но всего 2 цента, так как никто не упоминает Guava или другие библиотеки и некоторые другие детали)
Если можете, используйте гуаву
Стоит указать путь гуавы, который значительно упрощает эти махинации:
Использование
Для неизменного списка
Используйте класс 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
.
Основная привлекательность может заключаться в уменьшении беспорядка из-за обобщений для безопасности типов, так как использование фабричных методов Guava позволяет выводить типы в большинстве случаев. Однако этот аргумент содержит меньше воды, так как Java 7 появилась с новым оператором diamond.
Но это не единственная причина (и Java 7 еще не везде): сокращенный синтаксис также очень удобен, а инициализаторы методов, как видно выше, позволяют писать более выразительный код. Вы делаете в одном вызове Guava то, что занимает 2 с текущими коллекциями Java.
Если не умеешь ...
Для неизменного списка
Используйте класс JDK Arrays
и его 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);
}