Очистить массив в Java / обработка - PullRequest
37 голосов
/ 17 ноября 2010

Кроме циклического прохождения каждого элемента в массиве и установки каждого в нуль, есть ли в Java / обработка встроенная функция, которая просто очищает массив (или уничтожает его, чтобы иметь возможность повторно объявить его как новый массив)?

Ответы [ 8 ]

63 голосов
/ 17 ноября 2010

Там

Arrays.fill(myArray, null);

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

Это, конечно, не позволяет вам изменить размер массива (до нуля), если вы имели в виду «пустой».Размеры массивов фиксированы, поэтому, если вы хотите, чтобы «новый» массив имел разные измерения, лучше всего просто переназначить ссылку на новый массив, как показывают другие ответы.Еще лучше использовать тип List, например ArrayList, который может иметь переменный размер.

24 голосов
/ 17 ноября 2010

Вы можете просто присвоить null ссылке. (Это будет работать для любого типа массива, а не только ints)

int[] arr = new int[]{1, 2, 3, 4};
arr = null;

Это «очистит» массив. Вы также можете назначить новый массив этой ссылке, если хотите:

int[] arr = new int[]{1, 2, 3, 4};
arr = new int[]{6, 7, 8, 9};

Если вас беспокоят утечки памяти, не беспокойтесь. Сборщик мусора очистит все ссылки, оставленные массивом.

Другой пример:

float[] arr = ;// some array that you want to clear
arr = new float[arr.length];

Это создаст новый float[], инициализированный значением по умолчанию для float.

7 голосов
/ 17 ноября 2010
array = new String[array.length];
2 голосов
/ 26 октября 2018

Если массив xco не является окончательным, то будет работать простое переназначение:

, т. Е.

xco = new Float[xco .length];

Это предполагает, что массив Array xco должен оставаться того же размера.Если в этом нет необходимости, создайте пустой массив:

xco= new Float[0];
2 голосов
/ 07 октября 2013

С этим быстрее выполняется очистка, чем с Arrays.fill (из Fast Serialization Lib). Я просто использую arrayCopy (является родным), чтобы очистить массив:

static Object[] EmptyObjArray = new Object[10000];

public static void clear(Object[] arr) {
    final int arrlen = arr.length;
    clear(arr, arrlen);
}

public static void clear(Object[] arr, int arrlen) {
    int count = 0;
    final int length = EmptyObjArray.length;
    while( arrlen - count > length) {
        System.arraycopy(EmptyObjArray,0,arr,count, length);
        count += length;
    }
    System.arraycopy(EmptyObjArray,0,arr,count, arrlen -count);
}
1 голос
/ 31 октября 2016

Взять в качестве примера двойной массив, если начальный входной массив values равен не пуст , следующий фрагмент кода превосходит традиционный прямой for-loop по сложности времени:

public static void resetValues(double[] values) {
  int len = values.length;
  if (len > 0) {
    values[0] = 0.0;
  }
  for (int i = 1; i < len; i += i) {
    System.arraycopy(values, 0, values, i, ((len - i) < i) ? (len - i) : i);
  }
}
1 голос
/ 17 ноября 2010

Я просто хочу добавить что-то в комментарий Марка. Если вы хотите повторно использовать массив без дополнительного выделения, просто используйте его снова и переопределите существующие значения новыми. Это будет работать, если вы заполните массив последовательно. В этом случае просто запомните последний инициализированный элемент и используйте массив до этого индекса. Неважно, что в конце массива есть какой-то мусор.

0 голосов
/ 04 февраля 2018

Я смог сделать это с помощью следующих 2 строк, у меня был массив с именем selected_items, используемый для получения всех выбранных элементов в dataTable

selected_items = null;
selected_items = [];
...