1.二维数组

关于数组的另一个有趣的事实。数组不仅是一维的(线性的)。它们也可以是二维的。

你问这是什么意思?

这意味着数组的单元格不仅可以表示一列(或行),还可以表示一个矩形表格。

int[][] name = new int[width][height];

其中name是数组变量的名称,width是表格宽度(以单元格为单位),height是表格高度。例子:

int[][] data = new int[2][5];
data[1][1] = 5;
我们创建一个二维数组:2 列和 5 行。
将 5 写入单元格 (1, 1)。

这是它在内存中的样子:

二维数组

顺便说一句,您还可以对二维数组使用快速初始化:

// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

作为程序员,您可能在很多地方都需要二维数组。二维数组是几乎所有棋盘游戏的基础,例如国际象棋、西洋跳棋、井字游戏和海战:

二维数组 2

二维阵列非常适合国际象棋或海战。我们只需要数字形式的单元格坐标。不是'pawn e2-e4',而是'pawn (5,2) -> (5,4)'。作为程序员,这对你来说会更容易。


2.排列数组中的元素:(x, y) or (y, x)

顺便说一句,这里有一个有趣的难题:

当我们使用创建数组时,我们有一个“两new int[2][5];”的表格还是“两五行”?”换句话说,我们是先指定宽度然后指定高度......还是反之亦然,先高后宽?好吧,正如我们常说的,这里的一切都不是那么简单。

先从数组在内存中如何存储的问题说起。

当然,计算机内存中实际上并没有矩阵:内存中的每个位置都有一个连续的数字地址:0、1、2,...在我们的例子中,我们说的是 2 × 5 矩阵,但在内存中它只是 10 个连续的单元格,仅此而已。没有任何内容指示行和列的位置。

赞成“宽度 x 高度”的论点。

支持这种方法的论点是,每个人都在学校学习数学,在那里他们了解到坐标对被写为“x”(即水平轴),然后是“y”(垂直维度)。这不仅仅是一个学校标准——它是一个普遍接受的数学标准。正如他们所说,你不能与数学争论。是这样吗?先宽后高?

支持“高度 x 宽度”的论据。

这个职位还有一个有趣的论点:二维数组的快速初始化。事实上,如果我们想初始化我们的数组,那么我们可以这样写代码:

// Matrix of important data
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

你没注意到什么吗?如果我们有这个怎么办?

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

如果我们在代码中逐行写入我们的数据,那么我们会得到一个 2 行 5 列的矩阵。

底线

我们能说什么?由您决定哪个对您更方便。最重要的是,从事同一项目的所有程序员都坚持采用相同的方法。

如果您从事的项目的代码包含大量已初始化的二维数组,那么很可能那里的所有内容都基于快速数据初始化,即您将拥有标准的“高度 x 宽度”。

如果您有幸发现自己在一个涉及大量数学和使用坐标的项目中(例如,游戏引擎),那么代码很可能会采用“宽 x 高”方法。


3.二维数组如何排列

现在您将了解二维数组的实际排列方式。准备好?

二维数组实际上是数组的数组!

换句话说,如果在普通数组的情况下,数组变量存储对存储数组元素的容器的引用,那么在二维数组的情况下,情况有点爆炸:二维数组变量存储一个对存储对一维数组的引用的容器的引用。最好只看一次,而不是尝试解释一百次:

二维数组是怎么排列的

左侧,我们有一个二维数组变量,它存储对二维数组对象的引用。在里面中间我们有一个二维数组对象,它的单元格中存放的是一维数组,也就是二维数组的行。在右侧您可以看到四个一维数组——我们的二维数组的行。

这就是二维数组的实际工作方式。这种方法为 Java 程序员提供了几个优势:

首先,由于“容器的容器”存储对“行数组”的引用,我们可以非常快速且轻松地交换行。要获得“容器的容器”,您只需指定一个索引而不是两个。例子:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

此代码可让您交换行:

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
二维数组





matrix[0]存储对第一行的引用。
我们交换参考。

结果,matrix数组看起来像这样:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

如果您引用二维数组的一个单元格,但您只在数组名称后指定一个索引,那么您指的是一个容器的容器,其单元格存储对普通一维数组的引用。