如何判断整型数组中的元素是否为空?

10

例子:

我想知道array[5]是否包含一个值或为空。

6个回答

22

原始数组中的元素不能是空的。它们总会被初始化为某些值(通常是对于int数组而言,是0,但这取决于你如何声明数组)。

如果你像下面这样声明数组(例如):

int [] myArray ;
myArray = new int[7] ;

如果没有设置初始值,所有数组元素将默认为0

声明数组的另一种语法是

int[] myArray = { 12, 7, 32, 15, 113, 0, 7 };

在这种情况下,数组(大小为七)的初始值是在花括号{}中给出的。


只是顺便提一下,我相信(虽然我不是100%确定)int[] myArray = new int[] {12, 7, 32, 15, 113, 0, 7}; 也是被允许的。也就是说,我相信你可以在创建数组前面加上new int[](尽管你不必这样做)。 - MetroidFan2002
@MetroidFan2002:是的,那个语法也是有效的。 - Bill the Lizard
1
如果你想要空值,你应该将其声明为Integer[]数组。使用int[]的问题在于你无法区分某人是否将其赋值为0,或者它是否默认为0。如果这没关系,那么可以使用原始类型。如果需要知道区别,就必须使用Integer。 - Matt

7

在Java数组中,不存在“空”元素。如果数组的长度至少为6,则元素5存在并且具有值。如果您没有将其他内容分配给该位置,则它将具有值零,就像对象的未初始化字段一样。

如果它是Object后代的数组,则可以检查元素是否等于null


如果没有给元素5分配任何值,那么它存储了什么? - kylex
整数默认初始化为0。 - user29053
1
它取决于数组的组件类型。对于所有数值原始类型,它是0。对于char类型,它是ASCII码0(也称为null字符)。对于byte类型,它是字节值0。对于布尔类型,它将是false。对于任何非原始类型(即对象),它将是null。 - Matt

3

你必须明确定义“空”的含义。根据数组的数据类型,你可以确定“空”的语义。例如,如果你有一个整数数组,你可以决定0表示为空。或者如果数组是引用类型,则可以将null视为为空。然后,通过比较array[5] == null或array[5] == 0等来检查是否为空。


2
原始数组(int、float、char等)永远不会“空”(我认为你的意思是“null”),因为原始数组元素永远不可能为null。
默认情况下,当分配int数组时,它通常包含0。然而,我从来不依赖于这一点(我猜是因为写了太多的C代码)。
一种方法是选择一个您想要视为“未初始化”的值。它可以是0、-1或其他您不会用作有效值的值。在分配之后将数组初始化为该值。
对象数组(String[]和任何扩展Object的对象数组)可以具有空元素,因此您可以创建一个Integer[]数组并将其初始化为null。我认为我更喜欢上述描述中使用魔术值的想法。

1
int类型默认值为0,在Java语言规范中有明确定义。 - Steve Kuo

0

简而言之

使用对象而不是基本类型。

Integer[] myArray …
… Objects.isNull( myArray[ 5 ] ) …
… Objects.nonNull( myArray[ 5 ] ) …

使用对象,而不是基本类型 ➠ int[] Integer[]

Bill the Lizard的答案是正确的。原始值数组没有空槽,所有槽都包含该数据类型的默认值元素。对于int,默认值为0,即零。

如果您想要跟踪数组中的空槽或“洞”,请将数组定义为持有对象引用而不是基本类型值。因此,您需要一个Integer[]而不是int[]

Integer[] integers = new Integer[ 12 ] ;
System.out.println( Arrays.toString( integers ) ) ;

null

运行时,我们可以看到所有元素都是null。这意味着该位置尚未放置任何对象引用。

[null,null,null,null,null,null,null,null,null,null,null,null]

让我们分配一些值。Java提供了auto-boxing,可以自动将int值转换为Integer对象。

    integers[ 2 ] = 42 ;                      // Auto-boxing.
    integers[ 5 ] = Integer.valueOf( 99 ) ;   // Unnecessary, because of auto-boxing.
    System.out.println( Arrays.toString( integers ) ) ;

运行后,我们看到有两个插槽被使用,而其余十个插槽(null)为空闲状态。

[null、null、42、null、null、99、null、null、null、null、null、null]

请参见Ideone.com上的代码运行.

您说:

我想知道 array[5] 是否包含值或为空。

测试null

boolean slotAtIndex5HoldsObjectRef = ( null != integers[ 5 ] ) ;  // Parens are not necessary, but improve readability.

true

使用Objects实用类更加优雅。

boolean slot5Filled = Objects.nonNull( integers[ 5 ] ) ;

true

如果未分配任何值,请指定默认值

    Integer x = Objects.requireNonNullElse( integers[ 5 ] , Integer.valueOf( 101 ) ) ;
    Integer y = Objects.requireNonNullElse( integers[ 7 ] , Integer.valueOf( 101 ) ) ;

-1
创建一个常量来定义空值,例如:
private static final int EMPTY = -1;

然后像这样创建数组:

int[] myArray = new int[size];
Arrays.fill(myArray, EMPTY);

然后要检查一个元素是否为空,可以这样做:

if (myArray[i] == EMPTY)
{
   //element i is empty
}

很难想出一个常数,你可以保证它永远不会是一个有效的值,可以合法地放入数组中。如果你真的需要知道是否添加了任何内容,最好使用整数数组并检查是否为空。 - Jacob Mattison
是的,这是一个很公正的观点,但是在实践中,我发现通常会有一系列有效的整数被添加到数组中,因此例如,负整数或者Integer.MAX/MIN_VALUE可以用作 EMPTY(空值)。 - Leigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接