Массивы переменной длины (динамические) в Java - PullRequest
104 голосов
/ 11 марта 2010

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

Ответы [ 9 ]

115 голосов
/ 11 марта 2010

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

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

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

Одно предупреждение: ArrayList может содержать только объекты (например, целые числа), но не примитивы (например, целые). В большинстве случаев autoboxing / autounboxing позаботится об этом молча, но вы можете получить странное поведение в зависимости от того, что делаете.

34 голосов
/ 11 марта 2010

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

Вместо

Integer[] ints = new Integer[x]

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

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

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

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

22 голосов
/ 11 марта 2010

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

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

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
10 голосов
/ 25 ноября 2015
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]);
}    
}

}

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

10 голосов
/ 01 июля 2013

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

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

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

7 голосов
/ 07 июля 2013
  1. Рекомендуется использовать List для работы с мелким размером.

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

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

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

int[] array = new int[ESTIMATED_SIZE];
4 голосов
/ 11 марта 2010

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

4 голосов
/ 11 марта 2010

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

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

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

0 голосов
/ 13 апреля 2013

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

...