Вопрос-ответ

Java dynamic array sizes?

Размеры динамического массива Java?

У меня есть class - XClass, который я хочу загрузить в массив XClasses:

XClass myClass[] = new XClass[10];
myclass[0] = new XClass();
myclass[9] = new XClass();

Однако я не знаю, понадобится ли мне 10, 8 или 12 классов или любое другое количество, если уж на то пошло.

Я не узнаю до выполнения.

Могу ли я изменять количество элементов в массиве "на лету"?
Если да, то как?

Переведено автоматически
Ответ 1

Нет, вы не можете изменить размер массива после его создания. Вам либо придется выделить его больше, чем, по вашему мнению, вам понадобится, либо принять накладные расходы, связанные с перераспределением, для увеличения которого он должен увеличиваться в размерах. Когда это произойдет, вам придется выделить новый массив и скопировать данные из старого в новый:

int[] oldItems = new int[10];
for (int i = 0; i < 10; i++) {
oldItems[i] = i + 10;
}
int[] newItems = new int[20];
System.arraycopy(oldItems, 0, newItems, 0, 10);
oldItems = newItems;

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

List<XClass> myclass = new ArrayList<XClass>();
myclass.add(new XClass());
myclass.add(new XClass());

Обычно ArrayList в любом случае является предпочтительным решением для массива по нескольким причинам. Во-первых, массивы изменяемы. Если у вас есть класс, который делает это:

class Myclass {
private int[] items;

public int[] getItems() {
return items;
}
}

вы создали проблему, поскольку вызывающий объект может изменить ваш личный элемент данных, что приводит ко всевозможным защитным копиям. Сравните это с версией списка:

class Myclass {
private List<Integer> items;

public List<Integer> getItems() {
return Collections.unmodifiableList(items);
}
}
Ответ 2

В java длина массива фиксирована.

Вы можете использовать список для хранения значений и вызвать toArray метод, если это необходимо, Смотрите следующий пример:

import java.util.List;
import java.util.ArrayList;
import java.util.Random;

public class A {

public static void main( String [] args ) {
// dynamically hold the instances
List<xClass> list = new ArrayList<xClass>();

// fill it with a random number between 0 and 100
int elements = new Random().nextInt(100);
for( int i = 0 ; i < elements ; i++ ) {
list.add( new xClass() );
}

// convert it to array
xClass [] array = list.toArray( new xClass[ list.size() ] );


System.out.println( "size of array = " + array.length );
}
}
class xClass {}
Ответ 3

Как уже говорили другие, вы не можете изменить размер существующего массива Java.

ArrayList - это самое близкое, что есть в стандартной Java, к массиву динамического размера. Однако в ArrayList (фактически интерфейсе списка) есть некоторые вещи, которые не "похожи на массив". Например:


  • Вы не можете использовать [ ... ] для индексации списка. Вы должны использовать методы get(int) и set(int, E).

  • Список массивов создается с нулевыми элементами. Вы не можете просто создать список массивов из 20 элементов, а затем вызвать set(15, foo).

  • Вы не можете напрямую изменять размер ArrayList. Вы делаете это косвенно, используя различные методы add, insert и remove.

Если вы хотите что-то более похожее на массив, вам нужно будет разработать свой собственный API. (Возможно, кто-то мог бы подключить существующую стороннюю библиотеку... Я не смог найти ни одного за 2 минуты "исследования" с помощью Google :-))

Если вам действительно нужен только массив, который растет по мере его инициализации, то решение примерно такое.

ArrayList<T> tmp = new ArrayList<T>();
while (...) {
tmp.add(new T(...));
}
// This creates a new array and copies the element of 'tmp' to it.
T[] array = tmp.toArray(new T[tmp.size()]);
Ответ 4

Вы устанавливаете количество элементов на любое желаемое значение во время его создания:

xClass[] mysclass = new xClass[n];

Затем вы можете инициализировать элементы в цикле. Я предполагаю, что это то, что вам нужно.

Если вам нужно добавить или удалить элементы в массив после его создания, то вам придется использовать ArrayList.

2023-06-26 21:58 java arrays