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


108

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

Ответы:


121

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

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

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

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


2
Интересно, почему следующий код правильный в java? int[] array = new int[size]; size- переменная, но длина массива должна быть фиксированной, я прав? @Lord Torgamus
jerry_sjtu

12
@jerry_sjtu да, массив не меняет размер, чтобы соответствовать sizeпо ходу выполнения программы; он получает любой размер, sizeкогда эта строка выполняется.
Pops

Каждый раз, когда я удаляю элемент из ArrayList, я получаю nullв конце. Есть идеи, почему?
Аарон Франке

37

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

Вместо того

Integer[] ints = new Integer[x]

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

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

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

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


хочу работать, пока не попробовал: List <Integer> ints = new ArrayList <Integer> ();
gorbysbm 01

5
Почему вы используете List<Integer>вместо ArrayList<Integer>?
Дин Михан

25

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

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

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

2
Почему вы объявляете ссылочную переменную типа List, а не ArrayList?
LppEdd

2
Поскольку это позволяет вам просто переключаться между реализациями List, если это необходимо, вам нужно только изменить новый XYZList (). Если переменная объявлена ​​как ArrayList, oyu может использовать методы, специфичные для этой реализации, что усложняет изменение.
Mnementh

1
Спасибо, я понял.
LppEdd

11

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

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

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


Я полагаю, вы хотели связать его с codereply.com/answer/6i5bur/java-dynamic-arrays.html
Амит Кумар Гупта,

Я не уверен, есть ли у ArrayList какой-либо метод put, как я вижу в исходном коде Java8. Просто пытаюсь узнать, как он себя ведет с заданной мощностью. Однако нашел метод ArrayList.add ().
Sanjeet A

11
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]);
}    
}

}

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


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

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

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

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

int[] array = new int[ESTIMATED_SIZE];


4

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

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

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


-4

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


1
это просто неправильно. связанный ответ вызывает System.arrayCopy (), копируя старый массив в новый с увеличенным размером, а затем добавляя новую запись. массивы по-прежнему не могут иметь динамический размер.
katzenhut
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.