У меня есть класс - xClass, который я хочу загрузить в массив xClass, поэтому я декларирую:
xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();
Однако я не знаю, понадобится ли мне 10. Мне может понадобиться 8, 12 или любой другой номер в этом отношении. Я не узнаю до времени выполнения. Могу ли я изменять количество элементов в массиве на лету? Если да, то как?
Ответы:
Нет, вы не можете изменить размер созданного массива. Вы должны либо выделить его больше, чем вы думаете, что вам нужно, либо принять накладные расходы на перераспределение, необходимые для увеличения размера. Когда это произойдет, вам придется выделить новый и скопировать данные из старого в новый:
Если вы окажетесь в такой ситуации, я настоятельно рекомендую вместо этого использовать Коллекции Java. В частности, по
ArrayList
существу обертывает массив и заботится о логике увеличения массива по мере необходимости:Как правило, в
ArrayList
любом случае предпочтительным решением является массив по нескольким причинам. Во-первых, массивы изменяемы. Если у вас есть класс, который делает это:вы создали проблему, так как вызывающий абонент может изменить ваш личный член данных, что приводит ко всем видам защитного копирования. Сравните это с версией списка:
источник
В java длина массива фиксирована.
Вы можете использовать список для хранения значений и
toArray
при необходимости вызывать метод. См. Следующий пример:источник
Как говорили другие, вы не можете изменить размер существующего массива Java.
ArrayList - это наиболее близкий стандарт Java к массиву динамического размера. Однако в ArrayList (фактически интерфейсе List) есть кое-что, что не похоже на массив. Например:
[ ... ]
для индексации списка. Вы должны использоватьget(int)
иset(int, E)
методы.set(15, foo)
.add
,insert
иremove
методы.Если вы хотите что-то более похожее на массив, вам нужно будет разработать свой собственный API. (Может быть, кто-то сможет подключиться к существующей сторонней библиотеке ... Я не смог найти ни одной с двухминутным «исследованием» с помощью Google :-))
Если вам действительно нужен только массив, который растет по мере его инициализации , тогда решение будет примерно таким.
источник
Вы устанавливаете количество элементов на все, что хотите, во время его создания:
Затем вы можете инициализировать элементы в цикле. Полагаю, это то, что вам нужно.
Если вам нужно добавить или удалить элементы в массив после его создания, вам придется использовать файл
ArrayList
.источник
Вы можете использовать ArrayList:
...
источник
Arrays.copyOf()
Метод имеет много вариантов решения проблемы с динамическим увеличением длины массива.Java API
источник
Да, заверните его и используйте фреймворк Коллекций.
Затем используйте List.toArray (), когда это необходимо, или просто перебирайте указанный List.
источник
Как говорят другие пользователи, вам, вероятно, понадобится реализация java.util.List.
Если по какой-то причине вам наконец понадобится массив, вы можете сделать две вещи:
Используйте список, а затем преобразуйте его в массив с помощью myList.toArray ()
Используйте массив определенного размера. Если вам нужен больший или меньший размер, вы можете изменить его с помощью методов java.util.Arrays.
Лучшее решение будет зависеть от вашей проблемы;)
источник
Вместо этого я рекомендую использовать векторы. Очень прост в использовании и имеет множество предопределенных методов для реализации.
чтобы добавить элемент, просто используйте:
В (5,2) первые 5 - это начальный размер вектора. Если вы превысите начальный размер, вектор вырастет на 2 места. Если снова превысит, то снова увеличится на 2 места и так далее.
источник
Где вы объявляете массив myclass [] как:
, просто передайте в качестве аргумента количество необходимых вам элементов XClass. В этот момент вы знаете, сколько вам понадобится? Объявляя массив как имеющий 10 элементов, вы не объявляете 10 объектов XClass, вы просто создаете массив из 10 элементов типа xClass.
источник
Размеры массивов Java фиксированы. Вы не можете создавать динамические массивы, как в C ++.
источник
Рекомендуется сначала получить сумму, которую нужно сохранить, а затем инициализировать массив.
например, вы могли бы спросить пользователя, сколько данных ему нужно сохранить, а затем инициализировать его, или запросить компонент или аргумент, сколько вам нужно сохранить. если вам нужен динамический массив, который вы могли бы использовать
ArrayList()
и использоватьal.add();
функцию для продолжения добавления, вы можете передать его в фиксированный массив.делать это излишне, но просто чтобы показать вам идею,
ArrayList
может содержать объекты, в отличие от других примитивных типов данных, и ими очень легко манипулировать, также легко удалить что-либо из середины, полностью динамически. то же самое сList
иStack
источник
Я не знаю, можете ли вы изменить размер во время выполнения, но вы можете выделить размер во время выполнения. Попробуйте использовать этот код:
это назначает размер вашего массива, чтобы он был введен во время выполнения в x.
источник
Вот метод, который не использует ArrayList. Пользователь указывает размер, и вы можете добавить цикл do-while для рекурсии.
источник
В Java размеры массивов всегда имеют фиксированную длину, но есть способ, которым вы можете динамически увеличивать размер массива во время выполнения.
Это наиболее "используемый", а также предпочтительный способ сделать это -
В приведенном выше коде мы инициализируем новый массив temp [] и далее используем цикл for для инициализации содержимого временного массива содержимым исходного массива, т.е. stck []. А затем снова копируем его обратно в исходный, давая нам новый массив new SIZE.
Несомненно, это вызывает накладные расходы ЦП из-за повторной инициализации массива с многократным использованием цикла for. Но вы все равно можете использовать и реализовать его в своем коде. Лучше всего использовать «Связанный список» вместо массива, если вы хотите, чтобы данные переменной длины динамически сохранялись в памяти.
Вот пример в реальном времени, основанный на динамических стеках, для увеличения размера массива во время выполнения
Имя файла: DStack.java
Имя файла: Exec.java
(с основным классом)
Надеюсь, это решит ваш вопрос.
источник
Да, мы можем так поступить.
источник
Поскольку ArrayList занимает много памяти, когда мне нужен массив примитивных типов, я предпочитаю использовать IntStream.builder () для создания массива int (вы также можете использовать построители LongStream и DoubleStream).
Пример:
Примечание: доступно с Java 8.
источник
Ты можешь кое-что сделать
источник