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