一个空数组和一个 null 数组有什么区别?

28

如果int数组的各个元素未初始化,它们默认存储什么?我发现好像有类似于空数组或null数组的东西。它们之间有什么区别,哪一个适用于我的第一个问题?


1
你可以拥有一个零长度的数组——不包含任何元素。你可以拥有一个空的数组引用——引用为null,意味着实际上没有数组存在。当数组被初始创建时,你可以拥有所有元素都设置为null的数组——这是引用数组的默认值。 - Hot Licks
4个回答

41

严格来讲,空数组并不存在;但由于数组属于对象,数组类型是引用类型(也就是说:数组变量只保存对数组的引用),这意味着一个数组变量可以为null而不是实际指向数组:

int[] notAnArray = null;

一个数组是长度为零的数组,它没有任何元素:

int[] emptyArray = new int[0];

(并且永远不可能具有元素,因为创建后数组的长度永远不会更改)。

当您创建一个空数组而没有为其元素指定值时,它们将默认为类似于零的值-对于整数数组为0,对于对象类型的数组为null等等;所以,这个:

int[] arrayOfThreeZeroes = new int[3];

与此相同:

int[] arrayOfThreeZeroes = { 0, 0, 0 };

尽管这些值在之后可以重新分配;数组的长度不能更改,但是它的元素可以更改。


4
布尔类型数组的默认值为false。 - Sriman

2

数组成员的初始化值为它们的默认值。对于 int 来说, 默认值是0。 对于 Object 来说,则是 null。 在Java中,一个 null 数组是一个 null 数组引用 (因为数组是Java中的引用类型)。

JLS-4.12.5 变量的初始值 中说:

对于 int 类型,默认值为零,即 0。

以及

对于所有引用类型(§4.3),默认值为 null


@Quantitative 正确。对于一个 Integer[],但是 double[] 会默认为0(作为原始类型)。 - Elliott Frisch
int[] a = new int[0] 中的索引0与默认值无关。 - Thomas Weller
@ThomasWeller int[] a = new int[1]; 在索引0处有一个默认值。实际上,任何长度大于0的数组在索引0处都有一个默认值。 - Elliott Frisch

1

默认情况下,Java根据声明的类型初始化数组。如果是int类型,则初始化为0。如果是对象类型,如对象数组,则初始化为null。


0
如果int数组的各个元素未初始化,它们默认存储什么?

0

空数组是指具有0个元素的数组

我还没听说过null数组,但它很可能是一个具有非零元素引用的数组,这些引用都是null


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