2014-12-16 3 views
1
String[] somestringarray = { "a","b","c"}; 

Кроме того,Есть ли разница между списком <String> A = new ArrayList <String>() и ArrayList <String> A = новый ArrayList <String>()?

List<String> A = new ArrayList<String>(Arrays.asList(somestringarray)); 

является Arrays.asList() коллекция? И инструкция инициализирует список размером somestringarray?

Почему я не могу просто somestringarray? в чем смысл объявления списка строк, что не так, только somestringarray?

+1

ArrayList не реализует интерфейс массива , поэтому вы не можете присвоить ArrayList эталонного значения для ссылки на массив переменного. –

+0

Кроме того, в Java нет интерфейса 'Array'. «ArrayList» - это своего рода «Список». 'Arrays.asList()' * возвращает * коллекцию. –

ответ

3

Массивы чрезвычайно простые, основные компоненты языка Java, без каких-либо приятных функций, предоставляемых картой коллекций: нет contains, фиксированный размер, неизбежно изменяемый и т. Д.

Arrays.asList возвращает специальный List реализацию, которая является только оберткой массива, переданного ему: он поддерживает set, contains, итерацию, и все, что, хотя он не поддерживает add или remove. Он может быть передан многим коммунальным предприятиям, которые ожидают Collection, однако, поскольку Arrays.asListделает возвращает List, который всегда является Collection.

Заявление

List<String> A = new ArrayList<String>(Arrays.asList(somestringarray)); 

, во-первых, упаковка ваш массив как List, но ограниченное применение, которое не поддерживает изменение размера. (Кроме того, List отражает изменения, внесенные somestringarray и изменения в List возвращенного Arrays.asList фактически изменить массив подкладочный а.) Затем, копирует, что в ArrayList, которая является полнофункциональным List реализации с поддержкой изменение размера и т. д., и поскольку он делает копию, она теперь не зависит от исходного массива.

+0

И, что хуже всего, массивы являются ковариантными, нарушая безопасность. –

+1

@DavidConrad Вы имеете в виду безопасность типа компиляции, поскольку во время выполнения массивы будут проверять правильность типа элемента, который мы пытаемся поместить в массив.Верно, что мы можем использовать ссылку 'Object []' для хранения массива 'String []', но если мы попытаемся разместить в таком массиве, например Integer, мы остановимся с небольшой помощью 'ArrayStoreException'. – Pshemo

+0

@Pshemo Да, безопасность во время компиляции. –

1

Java Arrays не являются динамическими структурами данных; после их инициализации они не могут быть изменены. В то время как List является интерфейсом Collection, а ArrayList - это List с поддержкой массива.

List<String> al = new ArrayList<>(Arrays.asList("a", "b")); 
al.add("c"); 

С массивами вам нужно

String[] arr = {"a","b"}; 
// can't add "c" now. 

добавить «с» при инициализации arr без его копирования в новый массив,

String[] t = new String[arr.length + 1]; 
System.arraycopy(arr, 0, t, 0, arr.length); 
t[t.length - 1] = "c"; 
arr = t; 
Смежные вопросы