Как я могу проверить, является ли массив нулевым / пустым?

137

У меня есть intмассив, в котором нет элементов, и я пытаюсь проверить, пуст ли он.

Например, почему условие оператора if в приведенном ниже коде никогда не выполняется?

int[] k = new int[3];

if (k == null) {
    System.out.println(k.length);
}
Анкит Сашан
источник
Не могли бы вы опубликовать немного больше кода, пожалуйста? Бит, где инициализируется массив, было бы полезно увидеть.
Марк Папа
Я не уверен, что вы спрашиваете. Чтобы убедиться, что массив равен нулю, можно сказать (array == null)
Пол
7
Не хотите ли вы (k! =
Null

Ответы:

214

Есть ключевое различие между nullмассивом и пустым массивом. Это тест для null.

int arr[] = null;
if (arr == null) {
  System.out.println("array is null");
}

«Пусто» здесь не имеет официального значения. Я выбираю определять пустой как имеющий 0 элементов:

arr = new int[0];
if (arr.length == 0) {
  System.out.println("array is empty");
}

Альтернативное определение «пусто», если все элементы null:

Object arr[] = new Object[10];
boolean empty = true;
for (int i=0; i<arr.length; i++) {
  if (arr[i] != null) {
    empty = false;
    break;
  }
}

или

Object arr[] = new Object[10];
boolean empty = true;
for (Object ob : arr) {
  if (ob != null) {
    empty = false;
    break;
  }
}
Клетус
источник
1
ups, последний фрагмент obj !- null, вероятно, имел в видуobj != null
user85421
5
Не забудьте про: org.apache.commons.lang3.ArrayUtils.isEmpty (k)
aholub7x
Помните, === не будет работать. Вы должны использовать ==, потому что nullэто другой тип.
Илия Мок
98

ArrayUtils.isNotEmpty(testArrayName)из пакета org.apache.commons.lang3гарантирует, что массив не является нулевым или пустым

Шраван Рамамурти
источник
20

Посмотрите на его длину:

int[] i = ...;
if (i.length == 0) { } // no elements in the array

Хотя безопаснее проверять на ноль одновременно:

if (i == null || i.length == 0) { }
Майк
источник
1
если вам нужно проверить как нулевое значение, так и длину 0, важно сначала проверить нулевое значение, как вы сделали, чтобы избежать возможной ошибки нулевого указателя
Билл Милагро
6

Метод для проверки массива на нулевой или пустой также присутствует на org.apache.commons.lang:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);
Jackkobec
источник
5

Я из .net фона. Однако java / c # более / менее одинаковы.

Если вы создаете экземпляр не примитивного типа (массив в вашем случае), он не будет нулевым.
Например, int[] numbers = new int[3];
в этом случае пространство выделяется, и каждый элемент имеет значение по умолчанию 0.

Это будет null, когда ты этого не сделаешь new.
например

int[] numbers = null; // changed as per @Joachim's suggestion.
if (numbers == null)
{
   System.out.println("yes, it is null. Please new it up");
}
shahkalpesh
источник
1
В Java это не скомпилируется, потому что оно скажет вам, что numbersеще не было инициализировано. «Неинициализированный» и nullне одно и то же.
Йоахим Зауэр
Спасибо Иоахим. Я отредактирую пост, чтобы он int[] numbersизменился на int[] numbers == null; В C # это не так.
Шахкалпеш,
2

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

объекты
источник
Что делать, если я должен проверить NULL на целое число
Ankit Sachan
1
Вы не можете проверить на ноль с примитивами, такими как int.
объекты
2
зависит от того, где вы объявили это, если как член класса, то да, он инициализируется с нулями. но когда объявлено локально внутри метода, я считаю, что это другой случай ... вы должны назначить начальное значение самостоятельно. я полагаю. просто мысль!
Ультра Джон
2

Дело здесь очень просто в том, что переменная k не равна нулю, потому что она указывает на массив. Неважно, что сам массив пуст. Нулевой тест в вашем посте будет иметь значение true, только если переменная k ни на что не указывает.

hubbabubba
источник
2

Я проверил, как показано ниже. Надеюсь, поможет.

Integer[] integers1 = new Integer[10];
        System.out.println(integers1.length); //it has length 10 but it is empty. It is not null array
        for (Integer integer : integers1) {
            System.out.println(integer); //prints all 0s
        }

//But if I manually add 0 to any index, now even though array has all 0s elements
//still it is not empty
//        integers1[2] = 0;
        for (Integer integer : integers1) {
            System.out.println(integer); //Still it prints all 0s but it is not empty
            //but that manually added 0 is different
        }

//Even we manually add 0, still we need to treat it as null. This is semantic logic.

        Integer[] integers2 = new Integer[20];
        integers2 = null; //array is nullified
//        integers2[3] = null; //If I had int[] -- because it is priitive -- then I can't write this line. 
        if (integers2 == null) {
            System.out.println("null Array");
        }   
Уддхав Гаутам
источник
0

intМассив без элементов не обязательно null. Это будет только в том nullслучае, если он еще не выделен. Видеть это руководство для получения дополнительной информации о массивах Java.

Вы можете проверить длину массива:

void foo(int[] data)
{
  if(data.length == 0)
    return;
}
размотать
источник
0
    public boolean empty() {
    boolean isEmpty = true;
    int i = 0;
    for (int j = 0; j < array.length; j++) {
        if (array[j] != 0) {
            i++;
        }
    }
    if (i != 0) {
        isEmpty = false;
    }
    return isEmpty;
}

Это так же близко, как я проверял, пустой ли массив int. Хотя это не будет работать, когда целые числа в массиве фактически равны нулю. Он будет работать для {1,2,3}, и все равно вернет false, если {2,0}, но {0} вернет true

nanatash
источник
0

В Java 8+ это достигается с помощью метода allMatch для потоков.

Для примитива:

int[] k = new int[3];
Arrays.stream(k).allMatch(element -> element != 0)

Для объекта:

Objects[] k = new Objects[3];
Arrays.stream(k).allMatch(Objects::nonNull)
Шиванг Агарвал
источник
-1

Я верю, что ты хочешь

int[] k = new int[3];

if (k != null) {  // Note, != and not == as above
    System.out.println(k.length);
}

Вы обновили его, так что он никогда не будет нулевым.

vickirk
источник
-1

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

int[] k = new int[3];
if(k.length == 0)
{
//do something
}
J_fruitty
источник