Массивы переменной длины (динамические) в Java

Мне было интересно, как инициализировать целочисленный массив, чтобы его размер и значения менялись в процессе выполнения моей программы, какие-либо предложения?


person Mohammad Sepahvand    schedule 11.03.2010    source источник


Ответы (9)


Да: используйте ArrayList.

В Java "нормальные" массивы имеют фиксированный размер. Вы должны указать им размер и не можете их расширять или сжимать. Чтобы изменить размер, вам нужно создать новый массив и скопировать нужные данные, что неэффективно и причиняет вам боль.

К счастью, существуют всевозможные встроенные классы, реализующие общие структуры данных, а также другие полезные инструменты. Вы можете проверить API Java 6, чтобы ознакомиться с их полным списком. .

Одно предостережение: ArrayList может содержать только объекты (например, целые числа), но не примитивы (например, целые числа). В БОЛЬШИНСТВЕ случаев autoboxing / autounboxing займет позаботиться об этом за вас молча, но вы можете получить какое-то странное поведение в зависимости от того, что вы делаете.

person Pops    schedule 11.03.2010
comment
Интересно, почему следующий код правильный в java? int[] array = new int[size]; size - переменная, но длина массива должна быть фиксированной, я прав? @Lord Torgamus - person jerry_sjtu; 27.03.2012
comment
@jerry_sjtu да, массив не меняет размер, чтобы соответствовать size по ходу выполнения программы; он получает тот размер, который находится в size при выполнении этой строки. - person Pops; 27.03.2012
comment
Всякий раз, когда я удаляю элемент из ArrayList, я получаю null в конце. Есть идеи, почему? - person Aaron Franke; 15.02.2018

Массивы в Java имеют фиксированный размер. Вам понадобится ArrayList, одна из очень ценных коллекций, доступных в Java.

Вместо того

Integer[] ints = new Integer[x]

ты используешь

List<Integer> ints = new ArrayList<Integer>();

Затем, чтобы изменить список, вы используете ints.add(y) и ints.remove(z) среди многих других удобных методов, которые вы можете найти в соответствующих Javadocs.

Я настоятельно рекомендую изучить классы коллекций, доступные в Java, поскольку они очень мощные и дают вам множество встроенных функций, которые новички в Java, как правило, пытаются без необходимости переписывать.

person MattGrommes    schedule 11.03.2010
comment
хочу работать, пока не попробовал: Список ‹Integer› ints = new ArrayList ‹Integer› (); - person HRVHackers; 01.02.2014
comment
Почему вы используете List<Integer> вместо ArrayList<Integer>? - person Dean Meehan; 18.11.2016

После создания массивы имеют фиксированный размер. Вместо этого вы можете использовать список.

Автобоксирование делает список пригодным для использования, похожим на массив, вы можете поместить в него просто int-значения:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
person Mnementh    schedule 11.03.2010
comment
Почему вы объявляете ссылочную переменную типа List, а не ArrayList? - person LppEdd; 08.02.2015
comment
Поскольку это позволяет вам просто переключаться между реализациями списка при необходимости, вам нужно только изменить новый XYZList (). Если переменная объявлена ​​как ArrayList, oyu может использовать методы, специфичные для этой реализации, что усложняет изменение. - person Mnementh; 09.02.2015
comment
Спасибо, я понял. - person LppEdd; 12.02.2015

Я не согласен с предыдущими ответами, предлагающими ArrayList, потому что ArrayList не динамический массив, а список, поддерживаемый массивом. Разница в том, что вы не можете делать следующее:

ArrayList list = new ArrayList(4);
list.put(3,"Test");

Это даст вам исключение IndexOutOfBoundsException, потому что в этой позиции еще нет элемента, хотя резервный массив допускает такое добавление. Поэтому вам нужно использовать настраиваемую реализацию расширяемого массива, например, предложенную @ randy-lance

person cspann    schedule 01.07.2013
comment
Я полагаю, вы хотели связать его с codereply.com/answer/6i5bur/java- dynamic-array.html - person Amit Kumar Gupta; 30.08.2015
comment
Я не уверен, есть ли у ArrayList какой-либо метод put, как я вижу в исходном коде Java8. Просто пытаюсь узнать, как он себя ведет с заданной мощностью. Однако нашел метод ArrayList.add (). - person Sanjeet A; 15.10.2016

Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

Источник: Как создать динамический массив

person Anuj Dhiman    schedule 25.11.2015

  1. Рекомендуется использовать List для работы с небольшими масштабами.

  2. Если у вас огромное количество чисел, НИКОГДА не используйте список и автобоксинг,

    Список ‹Целое число> список

Для каждого отдельного int автоматически создается новое целое число. Вы заметите, что он замедляется, когда размер списка увеличивается. Эти целые числа являются ненужными объектами. В этом случае лучше использовать приблизительный размер,

int[] array = new int[ESTIMATED_SIZE];
person Hao Deng    schedule 07.07.2013

Как насчет использования вместо этого List? Например, ArrayList<integer>

person Konrad Garus    schedule 11.03.2010

Вы не можете изменить размер массива. Однако вы можете создать новый массив нужного размера и скопировать данные из старого массива в новый.

Но лучший вариант - использовать IntList из jacarta commons. (здесь)

Он работает так же, как List, но занимает меньше места и более эффективен, потому что он хранит int вместо хранения объектов оболочки над int (что такое класс Integer).

person Thiago Chaves    schedule 11.03.2010

Я ответил на этот вопрос, и нет, вам не нужен Arraylist или что-то еще, это было задание, и я выполнил его, поэтому да, массивы могут увеличиваться в размере. Вот ссылка Как использовать динамический массив Java и здесь это ссылка на мой вопрос, на который я ответил Динамические массивы Java

person Nobody    schedule 13.04.2013
comment
это просто неправильно. связанный ответ вызывает System.arrayCopy (), копируя старый массив в новый с увеличенным размером, а затем добавляя новую запись. массивы по-прежнему не могут иметь динамический размер. - person katzenhut; 20.04.2015