Общие массивы параметризованных ArrayLists в Java? - PullRequest
2 голосов
/ 21 марта 2010

Я новичок в Java, поэтому я не знаю о мелочах.
Почему я не могу создать общий массив параметризованного ArrayList?
Вместо этого мне нужно написать,

ArrayList<String>[] alist = new ArrayList[10]; 

или я должен создать список списков массивов.
Разве массивы не должны быть более эффективными, чем списки массивов?Тогда почему Java не допускает этого?
Кроме того, в чем разница между следующими двумя строками.

ArrayList<String>[] alist = new ArrayList[10];  
ArrayList<String>[] alist = new ArrayList<?>[10];  

Ответы [ 4 ]

2 голосов
/ 21 марта 2010

На самом деле реализация ArrayList очень эффективна для действий чтения и записи, которые не изменяют размер списка.Во многих случаях (по крайней мере, начиная с Java 1.6) компилятор полностью удаляет накладные расходы при вызове метода (например, для get ()).

Также не многим программам требуется производительность, которую предлагает массив, поэтому не беспокойтесь об использовании массивов, пока ваш код не станет слишком медленным (и даже тогда вам, вероятно, не понадобятся массивы)

2 голосов
/ 21 марта 2010

Причина, по которой вы должны это сделать, заключается в том, что дженерики на самом деле не существуют в Java. Это на самом деле взломать компилятор .

Что касается двух выложенных вами строк, не должно быть никакой разницы с точки зрения создаваемого байт-кода. Однако в первом случае вы, вероятно, получите предупреждение, потому что ваш компилятор думает, что вы забыли, что java.util.ArrayList хочет параметр типа, тогда как последний не будет компилироваться, потому что вы пытаетесь создать экземпляр универсального массива. Ситуация проигрыша: (

1 голос
/ 21 марта 2010

Я бы также порекомендовал создать массив списков.

ArrayList<ArrayList<Type>> alist = new ArrayList<ArrayList<Type>>();

, где Type - это любой тип, который вы хотели бы видеть в списке.Теперь у вас есть массив, содержащий списки массивов.Если вы хотите добавить массив, вы можете сделать:

alist.add(new ArrayList<Type>());
1 голос
/ 21 марта 2010

Если бы вы могли сделать это, это произойдет:

ArrayList<String>[] alist = new ArrayList<String>[10];
Object[] olist = alist;   // This is okay because ArrayList is an Object
olist[0] = new ArrayList<Dog>();
olist[0].add(new Dog());
String s = alist[0].get(0);  //Uh oh, Dog is not string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...