У меня есть intмассив, в котором нет элементов, и я пытаюсь проверить, пуст ли он.
Например, почему условие оператора if в приведенном ниже коде никогда не выполняется?
int[] k = new int[3];
if (k == null) {
System.out.println(k.length);
}
У меня есть intмассив, в котором нет элементов, и я пытаюсь проверить, пуст ли он.
Например, почему условие оператора if в приведенном ниже коде никогда не выполняется?
int[] k = new int[3];
if (k == null) {
System.out.println(k.length);
}
Ответы:
Есть ключевое различие между 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;
}
}
obj !- null, вероятно, имел в видуobj != null
nullэто другой тип.
ArrayUtils.isNotEmpty(testArrayName)из пакета org.apache.commons.lang3гарантирует, что массив не является нулевым или пустым
Посмотрите на его длину:
int[] i = ...;
if (i.length == 0) { } // no elements in the array
Хотя безопаснее проверять на ноль одновременно:
if (i == null || i.length == 0) { }
Я из .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");
}
numbersеще не было инициализировано. «Неинициализированный» и nullне одно и то же.
int[] numbersизменился на int[] numbers == null; В C # это не так.
Массив int инициализируется нулем, поэтому он фактически никогда не будет содержать нулей. Изначально только массивы объектов будут содержать нуль.
Дело здесь очень просто в том, что переменная k не равна нулю, потому что она указывает на массив. Неважно, что сам массив пуст. Нулевой тест в вашем посте будет иметь значение true, только если переменная k ни на что не указывает.
Я проверил, как показано ниже. Надеюсь, поможет.
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");
}
intМассив без элементов не обязательно null. Это будет только в том nullслучае, если он еще не выделен. Видеть это руководство для получения дополнительной информации о массивах Java.
Вы можете проверить длину массива:
void foo(int[] data)
{
if(data.length == 0)
return;
}
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
В 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)