2010-03-11 4 views

ответ

107

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

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

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

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

+2

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

+9

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

+0

Всякий раз, когда я удаляю элемент из массива ArrayList, я заканчиваю «нуль» в конце. Любые идеи почему? –

4

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

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

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

4

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

17

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

Autoboxing сделать список полезным, похожий на массив, вы можете просто положить Инт-значение в нем:

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

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

+1

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

+1

Спасибо, я понимаю. – LppEdd

29

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

Вместо

Integer[] ints = new Integer[x] 

использовать

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

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

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

+0

хочу работать до тех пор, пока я не попытался: Список ints = new ArrayList (); – gorbysbm

+2

Почему вы используете 'List ' вместо' ArrayList '? –

-3

Я ответил на этот вопрос, и вам не нужен аррайалист или любая другая вещь, это было задание, и я закончил его, поэтому да массивов может увеличиться в размере.Вот ссылка How to use Java Dynamic Array и вот ссылка на мой вопрос, который я ответил Java Dynamic arrays

+1

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

8

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

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

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

+0

Я считаю, что вы хотели связать его с http://codereply.com/answer/6i5bur/java-dynamic-arrays.html –

+0

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

8
  1. Это рекомендуется использовать список, чтобы иметь дело с малым размером шкалы.

  2. Если у вас есть огромное количество чисел, NEVER Список использования и Autoboxing,

    Список < Integer> Список

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

int[] array = new int[ESTIMATED_SIZE]; 
7
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]); 
}  
} 

} 

Источник: How to make dynamic array

Смежные вопросы