Любой ярлык для инициализации всех элементов массива в ноль? - PullRequest
247 голосов
/ 28 января 2010

В C/C++ Раньше я делал

int arr[10] = {0};

чтобы инициализировать все мои элементы массива равными 0.
Существует ли аналогичный ярлык в Java?
Я хочу избежать использования цикла, это возможно?

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;

Ответы [ 13 ]

521 голосов
/ 28 января 2010

Значение по умолчанию 0 для массивов целочисленных типов гарантируется языковой спецификацией :

Каждая переменная класса, переменная экземпляра или компонент массива инициализируется значением по умолчанию при его создании (§15.9, §15.10) [...] Для типа int - значение по умолчанию ноль, то есть 0.

Если вы хотите инициализировать массив другим значением, вы можете использовать java.util.Arrays.fill () (который, конечно, будет использовать цикл внутри).

89 голосов
/ 25 августа 2011

Хотя остальные ответы верны (значения массива int по умолчанию инициализируются равными 0), если вы хотите явно сделать это (например, если вы хотите, чтобы массив был заполнен значением 42), вы можете использовать заливку ( ) метод класса Arrays :

int [] myarray = new int[num_elts];
Arrays.fill(myarray, 42);

Или, если вы поклонник 1-лайнеров, вы можете использовать процедуру Collections.nCopies():

Integer[] arr = Collections.nCopies(3, 42).toArray(new Integer[0]);

Даст arr значение:

[42, 42, 42]

(хотя это Integer, а не int, если вам нужен примитивный тип, который вы можете отложить на Apache Commons ArrayUtils.toPrimitive() рутина:

int [] primarr = ArrayUtils.toPrimitive(arr);
34 голосов
/ 28 января 2010

В Java все элементы по умолчанию инициализируются в 0. Вы можете сохранить цикл.

19 голосов
/ 04 июня 2013

Как это снижает производительность вашего приложения ....? Читать далее.

В спецификации языка Java Значение по умолчанию / начальное значение для любого объекта может быть задано следующим образом.

Для типа байт значение по умолчанию равно ноль , то есть значение (байт) равно 0 .

Для типа short значение по умолчанию равно ноль , то есть значение (short) равно 0 .

Для типа int значение по умолчанию равно нулю , то есть 0 .

Для типа long значение по умолчанию равно ноль , то есть 0L .

Для типа с плавающей запятой значение по умолчанию равно положительный ноль , то есть 0,0f .

Для типа double значение по умолчанию равно положительный ноль , то есть 0.0d .

Для типа char значением по умолчанию является null символ, то есть ' \ u0000 '.

Для типа логическое значение по умолчанию равно false .

Для всех типов ссылок , значение по умолчанию равно null .

Учитывая все это, вам не нужно инициализировать нулевыми значениями для элементов массива, потому что по умолчанию все элементы массива равны 0 для массива int.

Поскольку массив является контейнерным объектом, который содержит фиксированное число значений одного типа. Теперь тип массива для вас int , поэтому рассмотрим значение по умолчанию для всех элементов массива, равное автоматически 0 , поскольку оно содержит тип int .

Теперь рассмотрим массив для Тип строки , так что все элементы массива имеют значение по умолчанию равно null .

Почему бы не сделать это ......?

Вы можете присвоить нулевое значение, используя цикл, как вы предлагаете в своем Вопросе.

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;

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

Чем больше используется машинный цикл ==> Больше времени для обработки данных ==> Время вывода будет значительно увеличено . так что обработка данных вашего приложения может рассматриваться как низкий уровень (от медленного до некоторого уровня).

15 голосов
/ 28 января 2010

Вы можете сохранить цикл, инициализация уже сделана равной 0. Даже для локальной переменной.

Но, пожалуйста, исправьте место, где вы ставите скобки, для удобства чтения (признанный лучший метод):

int[] arr = new int[10];
13 голосов
/ 11 декабря 2013

Если вы используете Float или Integer, тогда вы можете назначить значение по умолчанию, например, вот так ...

Integer[] data = new Integer[20];
Arrays.fill(data,new Integer(0));
5 голосов
/ 08 июля 2016

Вы можете создать новый пустой массив с существующим размером массива, и вы можете назначить их обратно вашему массиву. Это может быстрее, чем другие. Фрагмент:

package com.array.zero;
public class ArrayZero {
public static void main(String[] args) {
    // Your array with data
    int[] yourArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    //Creating same sized array with 0
    int[] tempArray = new int[yourArray.length];
    Assigning temp array to replace values by zero [0]
    yourArray = tempArray;

    //testing the array size and value to be zero
    for (int item : yourArray) {
        System.out.println(item);
    }
}
}

Результат:

0
0
0
0
0    
0
0
0
0
1 голос
/ 12 августа 2017

Еще один подход с использованием лямбда выше Java 8

 Arrays.stream(new Integer[nodelist.size()]).map(e -> 
 Integer.MAX_VALUE).toArray(Integer[]::new);
1 голос
/ 21 июня 2017

Значения int уже равны нулю после инициализации, как все упоминали. Если у вас есть ситуация, когда вам действительно нужно установить значения массива на ноль и вы хотите оптимизировать это, используйте System.arraycopy:

static private int[] zeros = new float[64];
...
int[] values = ...
if (zeros.length < values.length) zeros = new int[values.length];
System.arraycopy(zeros, 0, values, 0, values.length);

Используется memcpy под прикрытием в большинстве или во всех реализациях JRE. Обратите внимание, что использование статики, подобной этой, безопасно даже для нескольких потоков, поскольку в худшем случае несколько потоков перераспределяют zeros одновременно, что ничего не мешает.

Вы также можете использовать Arrays.fill, как упоминали некоторые другие. Arrays.fill может использовать memcpy в интеллектуальной JVM, но, вероятно, это просто цикл Java и проверка границ, что влечет за собой.

Оцените ваши оптимизации, конечно.

1 голос
/ 08 апреля 2016

Да, значения int в массиве инициализируются нулями. Но вам это не гарантировано. В документации Oracle говорится, что это плохая практика кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...