简体   繁体   English

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

[英]How can I check whether an array is null / empty?

I have an int array which has no elements and I'm trying to check whether it's empty.我有一个没有元素的int数组,我正在尝试检查它是否为空。

For example, why is the condition of the if-statement in the code below never true?例如,为什么下面代码中 if 语句的条件永远不为真?

int[] k = new int[3];

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

There's a key difference between a null array and an empty array. null数组和空数组之间有一个关键的区别。 This is a test for null .这是对null的测试。

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

"Empty" here has no official meaning.这里的“空”没有官方意义。 I'm choosing to define empty as having 0 elements:我选择将空定义为具有 0 个元素:

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

An alternative definition of "empty" is if all the elements are null : “空”的另一种定义是如果所有元素都为null

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

or或者

Object arr[] = new Object[10];
boolean empty = true;
for (Object ob : arr) {
  if (ob != null) {
    empty = false;
    break;
  }
}

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

Look at its length:看它的长度:

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

Though it's safer to check for null at the same time:虽然同时检查 null 更安全:

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

Method to check array for null or empty also is present on org.apache.commons.lang: org.apache.commons.lang 上也存在检查数组是否为空或空的方法:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);

I am from .net background.我来自 .net 背景。 However, java/c# are more/less same.但是,java/c# 或多/少相同。

If you instantiate a non-primitive type (array in your case), it won't be null.如果你实例化一个非原始类型(在你的例子中是数组),它不会为空。
eg int[] numbers = new int[3];例如int[] numbers = new int[3];
In this case, the space is allocated & each of the element has a default value of 0.在这种情况下,空间被分配,每个元素的默认值为 0。

It will be null , when you don't new it up.当你不new它时,它将是null
eg例如

int[] numbers = null; // changed as per @Joachim's suggestion.
if (numbers == null)
{
   System.out.println("yes, it is null. Please new it up");
}

An int array is initialised with zero so it won't actually ever contain nulls. int 数组初始化为零,因此它实际上永远不会包含空值。 Only arrays of Object's will contain null initially.只有 Object 的数组最初会包含 null。

The point here very simply is that the variable k isn't null because it points to the array.这里的要点很简单,变量 k 不为空,因为它指向数组。 It doesn't matter that the array itself is empty.数组本身是否为空并不重要。 The null test in your post would only evaluate to true if the variable k didn't point to anything.如果变量 k 没有指向任何内容,则您帖子中的空测试只会评估为真。

I tested as below.我测试如下。 Hope it helps.希望能帮助到你。

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

In Java 8+ you achieve this with the help of streams allMatch method.在 Java 8+ 中,您可以借助流 allMatch 方法来实现这一点。

For primitive:对于原始:

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

For Object:对于对象:

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

if you are trying to check that in spring framework then isEmpty(Object[]) method in ObjectUtils class helps,如果您试图在 spring 框架中检查,那么ObjectUtils类中的isEmpty(Object[])方法会ObjectUtils帮助,

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

An int array without elements is not necessarily null .没有元素的int数组不一定是null It will only be null if it hasn't been allocated yet.如果尚未分配,它只会为null See this tutorial for more information about Java arrays.有关 Java 数组的更多信息,请参阅本教程

You can test the array's length:您可以测试数组的长度:

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

This is as close as I got to checking if an int array is empty.这与我要检查 int 数组是否为空一样接近。 Although this will not work when the ints in the array are actually zero.尽管当数组中的整数实际上为零时这将不起作用。 It'll work for {1,2,3}, and it'll still return false if {2,0} but {0} will return true它适用于 {1,2,3},如果 {2,0} 但 {0} 将返回 true,它仍然会返回 false

I believe that what you want is我相信你想要的是

int[] k = new int[3];

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

You newed it up so it was never going to be null.您对其进行了更新,因此它永远不会为空。

You can also check whether there is any elements in the array by finding out its length, then put it into if-else statement to check whether it is null.也可以通过找出数组的长度来判断数组中是否有元素,然后放入if-else语句中判断是否为空。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM