如何检查数组是否为 null/null?

我有一个没有元素的 int数组,我试图检查它是否为空。

例如,为什么下面代码中 if 语句的条件永远不为真?

int[] k = new int[3];


if (k == null) {
System.out.println(k.length);
}
890343 次浏览

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;
}
}

没有元素的 int数组不一定是 null。如果它还没有被分配,那么它将只是 null。有关 Java 数组的更多信息,请参见 本教程

您可以测试数组的长度:

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

我来自.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");
}

看看它的长度:

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

尽管同时检查 null 更安全:

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

Int 数组的初始化值为零,因此它实际上不会包含 null。只有 Object 的数组最初包含 null。

我相信你想要的是

int[] k = new int[3];


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

你更新了它,所以它永远不会是无效的。

来自包 org.apache.commons.lang3ArrayUtils.isNotEmpty(testArrayName)确保 Array 不为 null 或空

这里的要点非常简单,变量 k 不为空,因为它指向数组。数组本身是否为空并不重要。如果变量 k 没有指向任何东西,那么文章中的 null 测试只会计算为 true。

我的测试结果如下,希望能有所帮助。

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

您还可以通过查找数组的长度来检查数组中是否有任何元素,然后将其放入 if-else 语句中以检查它是否为 null。

int[] k = new int[3];
if(k.length == 0)
{
//do something
}
    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 数组是否为空的结果。 尽管当数组中的 int 实际上为零时,这将不起作用。对于{1,2,3}仍然有效,如果{2,0}但是{0}将返回 true,则仍然返回 false

检查数组是否为 null 或空的方法也出现在 org.apache.commanss.lang 上:

import org.apache.commons.lang.ArrayUtils;


ArrayUtils.isEmpty(array);

在 Java8 + 中,可以借助流 allMatch 方法实现这一点。

原始的:

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

对象:

Objects[] k = new Objects[3];
Arrays.stream(k).allMatch(Objects::nonNull)

如果你试图在 Spring 框架中检查,那么 ObjectUtils类中的 isEmpty(Object[])方法会有所帮助,

public static boolean isEmpty(@Nullable Object[] array) {
return (array == null || array.length == 0);
}