Не смешивайте массивы и коллекции. На самом деле, не используйте массивы, если вы не имеете дело с примитивами (или не знаете, что делаете). Массивы - это кошмар юзабилити, они делают ваш код неуправляемым.
Шон Патрик Флойд
13
@SeanPatrickFloyd Можете ли вы объяснить, почему массивы - это кошмар юзабилити?
пользователь
3
@crucifiedsoul уверен. массив не может расти, вы ничего не можете вставить в массив, массив не переопределяет стандартные методы, такие как equals hashcode, toString и т. д.
Шон Патрик Флойд
9
@SeanPatrickFloyd хорошо - ну, мне нужно ровно четыре массива - я планирую получить доступ к каждому по индексу - мне не нужен внешний массив для роста или сжатия - мне не нужны ни toString, ни хэш-код и т. Д. - - для меня массив здесь очевидный выбор - что бы вы порекомендовали в качестве альтернативы в этой ситуации?
BrainSlugs83
4
Хорошо, это старый вопрос, но я все равно задам вопрос и посмотрю, кто ответит. Я вижу, как все говорят о том, почему массив списков является ужасной идеей, плохой практикой кодирования и т. Д. Я искал это, потому что я учусь создавать цепочки хешей, а определение цепочки хешей - это массив списков! Так как именно центральная структура данных программирования может быть ужасной практикой кодирования? Или это просто попадает в категорию IYKWYD, упомянутую @Sean?
List<List<Individual>> group = new ArrayList<List<Individual>>();вероятно, будет лучше.
Том Хотин -
4
Что значит «не может создать массив универсального типа»? Это на самом деле не имеет смысла для меня, потому что это не универсально, если вы предоставляете то, что он должен держать, верно?
Энди
5
Я удивлен голосами против, поскольку они не отвечают на вопрос (т.е. я хочу сделать это, как я могу это сделать). За исключением, может быть, для 1-го предложения.
Флориан Ф
15
почему список ссылок лучше, чем ArrayList?
шифу
3
@shifu Список ссылок является более общим, чем ArrayList; объявление как List абстрагирует API ArrayList, который выходит за пределы List API. Это хорошо, потому что он упрощает ссылку на List, чей API, вероятно, имеет в полном объеме то, что List необходим в любом случае, не загромождая API этой ссылки дополнительными функциями ArrayList. Вы должны объявлять ArrayList только в том случае, если вам нужно что-то конкретное из его API, которое будет доступно через ссылку.
виолончель
98
Как уже упоминали другие, вероятно, лучше использовать другой список для хранения ArrayList, но если вам нужно использовать массив:
ArrayList<Individual>[] group =(ArrayList<Individual>[])newArrayList[4];
Кажется, никто не может объяснить, почему, и мне нравится ваш фрагмент выше. почему вы рекомендуете использовать список над этим?
clankill3r
3
Если группа массивов не изменяется, тогда этот подход лучше, поскольку массивы работают быстрее, чем классы List <>.
Борж
33
Спасибо за ответ на вопрос. Нет логической причины автоматически предполагать, что список предпочтительнее массива без дополнительного контекста.
Специальный соус
3
По какой-либо причине это будет предпочтительнее, чем @kelvincer Answer ( ArrayList<String>[] group = new ArrayList[4])? Что еще хорошего делает актерский состав?
виолончель
2
Вы должны использовать, new ArrayList<?>[N]чтобы избежать использования необработанного типа.
Это удовлетворительно имеет желаемое преимущество, так как добавление ArrayList любого объекта, кроме String (т.е. ArrayList<String>вместо ArrayList<NotString>) group, не компилируется
cellepo
12
Это дает предупреждение:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Я совершенно не понимаю, почему все предлагают тип генриков в массиве специально для этого вопроса.
Что делать, если мне нужно, чтобы индексировать nразличных массивов.
С объявлением List<List<Integer>>мне нужно создавать nArrayList<Integer>объекты вручную или использовать цикл for для создания nсписков или каким-либо другим способом, в любом случае, моя обязанность - создавать nсписки.
Разве это не здорово, если мы объявим это через кастинг как List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]. Я вижу в этом хороший дизайн, когда не нужно создавать все индексирующие объекты (массивы) самостоятельно.
Может ли кто-нибудь просветить меня, почему этот (массив) будет плохим дизайном и каковы его недостатки?
AFAICT, похоже, что-то вроде менталитета культового груза, вызванного ужасной системой типизации, которую Java предлагает.
BrainSlugs83
@smsIce: это неплохой дизайн. Проблема в том, что многие авторы не читают полный вопрос или не понимают его четко.
Testo
16
Вы можете создать Array of ArrayList
List<Integer>[] outer =newList[number];for(int i =0; i < number; i++){
outer[i]=newArrayList<>();}
Это будет полезно в подобных сценариях. Вы знаете размер внешнего. Но размер внутренних варьируется. Здесь вы можете создать массив фиксированной длины, который содержит изменяющиеся по размеру списки массивов. Надеюсь, это будет полезно для вас.
В Java 8 и выше вы можете сделать это намного лучше.
List<Integer>[] outer =newList[number];Arrays.setAll(outer, element ->newArrayList<>());
Когда вы используете ArrayList::new, он будет вызывать ArrayList(int)contructor с текущим индексом в качестве аргумента - ArrayList (1), ArrayList (2), ArrayList (3) и т. Д. Таким образом, вы получите в результате либо массивы меньшего или большего размера, в зависимости от вашего использования. Я бы не рекомендовал использовать его и вместо этого предпочел бы второй подход, когда вы сами вызываете конструктор в своем лямбда-выражении.
Genhis
8
Это работает, массив ArrayList. Дайте ему попытку понять, как это работает.
import java.util.*;publicclassArrayOfArrayList{publicstaticvoid main(String[] args){// Put the length of the array you needArrayList<String>[] group =newArrayList[15];for(int x =0; x < group.length; x++){
group[x]=newArrayList<>();}//Add some thing to first array
group[0].add("Some");
group[0].add("Code");//Add some thing to Secondarray
group[1].add("In here");//Try to output 'emSystem.out.println(group[0]);System.out.println(group[1]);}}
Проблема в этой ситуации состоит в том, что при использовании массива ArrayList вы получаете временную сложность o (n) для добавления в определенной позиции. Если вы используете массив, вы создаете область памяти, объявляя ваш массив, поэтому он постоянный
Чтобы объявить массив ArrayLists статически для, скажем, позиций спрайтов как Points:
ArrayList<Point>[] positionList =newArrayList[2];publicMain(---){
positionList[0]=newArrayList<Point>();// Important, or you will get a NullPointerException at runtime
positionList[1]=newArrayList<Point>();}
динамически:
ArrayList<Point>[] positionList;int numberOfLists;publicMain(---){
numberOfLists =2;
positionList =newArrayList[numberOfLists];for(int i =0; i < numberOfLists; i++){
positionList[i]=newArrayList<Point>();}}
Несмотря на предостережения и некоторые сложные предложения, я обнаружил, что массив ArrayLists является элегантным решением для представления связанных ArrayLists одного типа.
Ответы:
Согласно документации Oracle :
Вместо этого вы можете сделать:
Как предположил Том Хоутинг - tackline, это еще лучше сделать:
источник
List<List<Individual>> group = new ArrayList<List<Individual>>();
вероятно, будет лучше.Как уже упоминали другие, вероятно, лучше использовать другой список для хранения ArrayList, но если вам нужно использовать массив:
источник
ArrayList<String>[] group = new ArrayList[4]
)? Что еще хорошего делает актерский состав?new ArrayList<?>[N]
чтобы избежать использования необработанного типа.Это работает:
источник
ArrayList<String>
вместоArrayList<NotString>
)group
, не компилируетсяNote: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Вы можете создать класс, расширяющий ArrayList
а затем создать массив
источник
Я совершенно не понимаю, почему все предлагают тип генриков в массиве специально для этого вопроса.
Что делать, если мне нужно, чтобы индексировать
n
различных массивов.С объявлением
List<List<Integer>>
мне нужно создаватьn
ArrayList<Integer>
объекты вручную или использовать цикл for для созданияn
списков или каким-либо другим способом, в любом случае, моя обязанность - создаватьn
списки.Разве это не здорово, если мы объявим это через кастинг как
List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]
. Я вижу в этом хороший дизайн, когда не нужно создавать все индексирующие объекты (массивы) самостоятельно.Может ли кто-нибудь просветить меня, почему этот (массив) будет плохим дизайном и каковы его недостатки?
источник
Вы можете создать Array of ArrayList
Это будет полезно в подобных сценариях. Вы знаете размер внешнего. Но размер внутренних варьируется. Здесь вы можете создать массив фиксированной длины, который содержит изменяющиеся по размеру списки массивов. Надеюсь, это будет полезно для вас.
В Java 8 и выше вы можете сделать это намного лучше.
Еще лучше, используя ссылку на метод
источник
ArrayList::new
, он будет вызыватьArrayList(int)
contructor с текущим индексом в качестве аргумента - ArrayList (1), ArrayList (2), ArrayList (3) и т. Д. Таким образом, вы получите в результате либо массивы меньшего или большего размера, в зависимости от вашего использования. Я бы не рекомендовал использовать его и вместо этого предпочел бы второй подход, когда вы сами вызываете конструктор в своем лямбда-выражении.Это работает, массив ArrayList. Дайте ему попытку понять, как это работает.
Кредиты для Kelvincer для некоторых кодов.
источник
Проблема в этой ситуации состоит в том, что при использовании массива ArrayList вы получаете временную сложность o (n) для добавления в определенной позиции. Если вы используете массив, вы создаете область памяти, объявляя ваш массив, поэтому он постоянный
источник
Вы не можете создать массив универсального типа. Создать список ArrayLists:
или если вам действительно нужен массив (ВНИМАНИЕ: плохой дизайн!):
источник
Создание и инициализация
Доступ для записи
для доступа к элементам внутреннего ArrayList:
Доступ для чтения
чтобы прочитать элемент массива i в качестве приведения типа ArrayList:
для элемента массива i: прочитать элемент ArrayList по индексу j
источник
List [] listArr = new ArrayList [4];
Выше строки выдает предупреждение, но оно работает (т.е. создает Array of ArrayList)
источник
Чтобы объявить массив ArrayLists статически для, скажем, позиций спрайтов как Points:
динамически:
Несмотря на предостережения и некоторые сложные предложения, я обнаружил, что массив ArrayLists является элегантным решением для представления связанных ArrayLists одного типа.
источник
источник
Вы можете создать так
ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
Вы должны создать массив не универсального типа, а затем преобразовать его в универсальный.
источник
ArrayList<Integer>[] graph = new ArrayList[numCourses]
Оно работает.источник
Я считаю, что это проще в использовании ...
источник
Ты можешь сделать это :
// Создать массив типа ArrayList
// Для каждого элемента в массиве создаем ArrayList
источник
источник
Вы можете создать список [] и инициализировать их с помощью цикла for. компилируется без ошибок:
он также работает с arrayList [] l.
источник
l.length
не определено в цикле for. Это может быть ошибка во время выполнения.