Масиви змінної довжини (динамічні) на Java


108

Мені було цікаво, як ініціалізувати цілий масив таким чином, щоб його розмір і значення змінювалися за рахунок виконання моєї програми, будь-яких пропозицій?

Відповіді:


121

Так: використовуйте ArrayList .

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

На щастя, є всілякі вбудовані класи, які реалізують загальні структури даних, та інші корисні інструменти. Вам потрібно перевірити API Java 6 для повного їх переліку.

Одне застереження: ArrayList може містити лише об'єкти (наприклад, Цілі особи), а не примітиви (наприклад, ints). У більшості випадків автобоксинг / автобоксинг подбає про це за вас мовчки, але ви можете отримати якусь дивну поведінку залежно від того, чим займаєтесь.


2
Цікаво, чому наступний код є правильним у Java? int[] array = new int[size]; sizeє змінною, але довжина масиву повинна бути виправлена, я правий? @ Lord Torgamus
jerry_sjtu

12
@jerry_sjtu так, масив не змінює розмір, щоб відповідати sizeпрограмі; він отримує незалежно від розміру, sizeколи ця лінія виконується.
Попс

Щоразу, коли я видаляю елемент із 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 намагаються переробляти без необхідності.


хочу працювати, поки я не спробував: Список <Integer> ints = новий ArrayList <Integer> ();
gorbysbm

5
Для чого ви використовуєте List<Integer>замість ArrayList<Integer>?
Дін Мейхан

24

Масиви мають фіксований розмір один раз миттєво. Ви можете використовувати Список замість цього.

Автобоксинг зробить Список, який можна використовувати аналогічно масиву, ви можете просто ввести цілі його значення:

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

2
Чому ви оголошуєте контрольну змінну типу List, а не ArrayList?
LppEdd

2
Оскільки це дозволяє вам просто перемикатися між списками-реалізаціями, якщо потрібно, вам потрібно лише змінити новий XYZList (). Якщо змінна оголошена ArrayList, оyu може використовувати методи, характерні для цієї реалізації, що робить зміни складнішими.
Мнемент

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 ().
Саньєт

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 і автобоксинг,

    Список <Цілий> список

Для кожного окремого int створюється автоматично новий Integer. Ви побачите, що вона стає повільною, коли розмір списку збільшується. Ці Цілі особи - це непотрібні об'єкти. У цьому випадку краще використовувати орієнтовний розмір,

int[] array = new int[ESTIMATED_SIZE];


4

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

Але ваш найкращий варіант - використовувати IntList від спільноти jacarta. ( тут )

Він працює так само, як List, але займає менше місця і є більш ефективним, ніж це, тому що він зберігає int's замість того, щоб зберігати обгорткові об'єкти над int's (ось що є клас Integer).


-4

Я відповів на це запитання, і ні вам не потрібен масив, або будь-яка інша річ, це було завдання, і я його виконав, щоб так масиви можуть збільшуватися в розмірі. Ось посилання Як користуватися Java Dynamic Array і ось посилання на моє запитання, на яке я відповів Java Dynamic масивів


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