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


137

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

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

int[] k = new int[3];

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

您能再发布一些代码吗?初始化数组的位将很有用。
Mark Pope'3

我不确定你在问什么。Surelly检查数组是否为空会说(array == null)
Paul Paul

7
您是否不想(k!= null)
维多利亚

Answers:


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,2010年

5
别忘了:org.apache.commons.lang3.ArrayUtils.isEmpty(k)
aholub7x 2012年

请记住,===无效。您必须使用==,因为null其类型不同。
伊莱贾克·莫克


20

看它的长度:

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

虽然同时检查null更安全:

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

1
如果您需要同时检查null和长度0,请务必先检查null是否已完成,以避免可能的null指针错误
Bill Milagro

6

org.apache.commons.lang中也提供了检查数组是否为空的方法:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);

5

我来自.net背景。但是,java / c#基本相同。

如果您实例化非原始类型(在您的情况下为数组),则该类型不会为null。
例如,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");
}

1
在Java中不会编译,因为它会告诉您numbers尚未初始化。与“未初始化” null并不相同。
Joachim Sauer'3

谢谢约阿希姆。我将编辑帖子int[] numbers更改为int[] numbers == null; 在c#中,情况并非如此。
shahkalpesh

2

一个int数组初始化为零,因此它实际上不会包含空值。最初只有Object数组将包含null。


如果我必须为整数检查null怎么办
Ankit Sachan'3

1
您不能使用int等原语检查null。
对象

2
取决于您在哪里声明它,如果作为类成员,则是的,它会以零初始化。但是当在方法内部局部声明时,我认为这是另一种情况……您必须自己分配一个初始值。我想。只是一个想法!
ultrajohn

2

这里的要点很简单,就是变量k不为null,因为它指向数组。数组本身为空并不重要。如果变量k没有指向任何内容,则帖子中的null测试只会评估为true。


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数组是否为空一样近。尽管当数组中的int实际上为零时这将不起作用。它适用于{1,2,3},如果{2,0}仍然返回false,但是{0}返回true


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

您已对其进行了更新,因此它永远不会为空。


-1

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

int[] k = new int[3];
if(k.length == 0)
{
//do something
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.