it-swarm.com.ru

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

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

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

int[] k = new int[3];

if(k==null)
{
    System.out.println(k.length);
}
101
Ankit Sachan

Существует ключевое различие между массивом 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;
  }
}
175
cletus

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

63
Shravan Ramamurthy

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

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

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

if (i == null || i.length == 0) { }
17
Mike

Я из .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");
}
4
shahkalpesh

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

2
hubbabubba

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

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");
        }   
2
Uddhav Gautam

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

2
objects
    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

0
nanatash

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

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

void foo(int[] data)
{
  if(data.length == 0)
    return;
}
0
unwind

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

int[] k = new int[3];
if(k.length == 0)
{
//do something
}
0
J_fruitty