1.内存中的数组

在前面的例子中,插图有点不准确。

创建数组时(与创建字符串时一样),会分配两个单独的内存块:一个用于存储数组容器)本身,第二个块用于存储其地址的变量。下图代表了这一澄清:

内存中的数组

为元素数组分配的内存10 intint[]存储数组地址的变量以绿色int显示。

int为了比较,存储值的普通变量199显示为蓝色。

这有点让人想起在内存中存储字符串,你不觉得吗?

没错,弦乐。就像使用字符串一样,您可以将数组变量赋值给另一个:

代码 解释
int[] a = new int[10];
a[2] = 4;
a[7] = 9;
int[] b = a;

a[9] = b[2] + a[7];
创建一个元素数组10 int
将值分配4给具有索引的单元格2
将值分配9给具有索引的单元格7
b变量中,保存变量存储的地址a
现在ab指向内存中的同一个数组对象。
在带有索引的数组对象的单元格中,写入存储在单元格(存储值)和(存储值)中的值9的总和。 2479

数组对象保留在原来的位置,并且ab变量将相同的地址(引用)存储到相同的对象。看图:

内存中的数组 2

2. 有关使用数组的更多详细信息

您可以创建任何类型的元素数组。为此,只需在类型名称后写上方括号即可。通常,创建数组如下所示:

type[] name = new type[number];

其中type是我们将存储在数组中的元素的类型。Name是我们将用来引用数组的变量的名称,number是数组中的单元格数。

上面的示例是创建数组变量和数组对象的规范形式。实际上,这是两个独立的实体。

您可以从数组对象中单独创建一个数组变量:

type[] name;
name = new type[number];

还有一点并非无关紧要:

您可以使用变量甚至整个表达式作为索引数组数组元素的数量

例子:

代码 解释
int n = 100;
int[] a = new int[n];
n创建一个元素数组
int n = 100;
int[] a = new int[n * 2 + 3];
创建一个包含203元素的数组
int n = 100;
int[] a = new int[n];
a[n-1] = 2;
a[n-2] = 3;
a[n/5] = a[n-1] + a[n-2]


// a[99] = 2;
// a[98] = 3;
// a[20] = a[99] + a[98];
重要的:
顺便说一句,您应该知道,如果您尝试使用数组中不存在的索引访问数组单元格(在我们的示例中,这意味着任何不在范围内的整数),那么程序将崩溃并0..99显示ArrayIndexOfBoundException,这意味着索引超出了数组的范围。

3.数组长度

正如您在前面的示例中看到的,您可以自己创建一个数组变量,然后在代码中的某处为其赋值(对数组对象的引用)。你甚至可以这样做:

代码 解释
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
创建一个数组变量,其类型为int[]
如果a变量小于10
则创建一个元素数组10
否则创建一个元素
数组20

现在你还能用这样的数组做什么?你怎么知道里面有多少元素?

为了解决这个问题,数组有一个名为 的特殊属性(变量)length。您可以使用以下表达式找到数组的长度:

array.length;

array是数组变量的名称,length是数组属性的名称。属性的值length不能改变:length属性本身可以赋值给其他变量,但不能赋值给它(如果你试图这样做,程序将无法编译)。

我们可以像这样继续前面的例子:

代码 解释
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
for (int i = 0; i < array.length; i++)
{
   System.out.println(array[i]);
}
创建一个数组变量,其类型为int[]
如果a变量小于10
则创建一个元素数组10
否则
创建一个20元素数组
循环遍历数组的所有元素:从0到长度array.length - 1

4. Java 中关于数组的事实总结

让我们回顾一下我们对数组的了解:

事实 1.数组由许多单元格组成。

事实 2.您可以使用其编号(索引)访问特定单元格。

事实 3.所有细胞都属于同一类型。

事实 4.所有单元格的初始值为 0(如果单元格存储数字)、null(如果单元格存储对象引用)或false(如果单元格存储boolean值)。您将在本章中了解有关默认值的更多信息

事实 5. String[] list只是一个变量的声明。这不会创建容器(数组对象)本身。要使用变量,首先需要创建一个数组(容器)并将其赋值给变量。请参见下面的示例。

事实 6.当我们创建一个数组对象(容器)时,我们必须指出它有多大,即它包含多少个单元格。这是通过如下语句完成的new TypeName[n]

事实 7.可以使用 属性找到数组的长度.length

事实 8.创建数组后,您不能更改其元素的类型或它存储的元素的数量。

代码 解释
String s;
String[] list;
snull
list_null
list = new String[10];
int n = list.length;
变量list存储对对象的引用:由10元素组成的字符串数组。
n10
list = new String[0];

现在list指的是一个元素数组0。数组存在,但不能存储任何元素。

list = null;
System.out.println(list[1]);
会抛出一个异常(程序错误),即程序会崩溃。list存储对的引用null
list = new String[10];
System.out.println(list[10]);
将产生数组越界异常(程序错误)。
如果 alist存储10元素/单元格,则有效索引为:0 1 2 3 4 5 6 7 8 910元素。