(старая ветка, но всего 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.
Основная привлекательность может заключаться в уменьшении беспорядка из-за обобщений для безопасности типов, поскольку использование фабричных методов Гуавы позволяет выводить типы в большинстве случаев. Тем не менее, этот аргумент содержит меньше воды, так как Java 7 прибыл с новым оператором Diamond.
Но это не единственная причина (и 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но на самом деле напрямую ссылается на переданный массив и заставляет его «проходить через» (изменения отражаются в массиве).
Он запрещает модификацию некоторых методов ListAPI путем простого расширения 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);
}