Java 为什么ArrayList的ArrayList不是多维的?

Java 为什么ArrayList的ArrayList不是多维的?,java,arrays,list,arraylist,multidimensional-array,Java,Arrays,List,Arraylist,Multidimensional Array,我最近参加了一次面试,面试官问了我一个关于Arrays和ArrayList的问题 他问我数组的数组是否可以是多维的,那么为什么ArrayList的ArrayList不是多维的呢 例如: // Multidimensional int[][] array = new int[m][n]; // Not multidimensional ArrayList<ArrayList<Integer>> seq = new ArrayList<ArrayList<In

我最近参加了一次面试,面试官问了我一个关于
Arrays
ArrayList
的问题

他问我数组的数组是否可以是多维的,那么为什么
ArrayList
ArrayList
不是多维的呢

例如:

// Multidimensional
int[][] array = new int[m][n]; 

// Not multidimensional
ArrayList<ArrayList<Integer>> seq = new ArrayList<ArrayList<Integer>>(); 
//多维
int[][]数组=新的int[m][n];
//非多维
ArrayList seq=新的ArrayList();

有人能帮我理解这一点吗?

一个
ArrayList
是的一个实现。它是一个使用数组实现的
列表。数组的使用是一个实现细节。不支持多维列表的概念,因此您也不希望
ArrayList
。此外,它并不是作为一个应用程序的用例来处理的


数组支持多维性,因为它是Java的一种语言特性。

从另一个角度来看:可以用与“多维”数组相同的方式使用列表。您只需将
array[row][column]
替换为
someList.get(row).get(column)

最后,java数组也是以类似的方式实现的:二维矩阵也是一维数组中的一维数组!换句话说:差异更多的是表面的,而不是深层次的概念原因

更准确地说:Java类型系统允许您放下
对象[]【】
,因此从这个意义上说,它知道
对象[]【】【】
;但正如所说,在现实中,没有多维数组;正如Java所看到的那样,“两维”是数组的引用数组

另一方面:“多维数组”有一个特定的概念,例如

multianewarray指令的第一个操作数是要创建的数组类类型的运行时常量池索引。第二个是实际创建的数组类型的维度数。multianewarray指令可用于创建类型的所有维度,如create3DArray的代码所示。请注意,多维数组只是一个对象,因此分别由aload_1和areturn指令加载和返回


我将在这里冒险回答这个问题,但是对于这个广泛的问题没有正确的答案

我们首先要问,是什么让数组是多维的

我假设你的面试官考虑的是一个多维数组,一个具有固定大小的数组(如你在问题中所示),在这里不能被认为是“锯齿状的”。根据微软的说法,C#中的数组如下所示:

锯齿阵列的元素可以具有不同的尺寸和大小

在Java中,多维数组只是一个数组,其中每个元素也是一个数组。这些数组必须定义为固定大小,以便在其中对元素进行索引,但锯齿数组可以具有不同的大小,如上所述


ArrayList
由数组支持;但是,当向数组中添加一定数量的元素时,该数组将扩展。因此,
ArrayList
可能会变得参差不齐,并且可能不再被认为是多维的


编辑:在把所有内容重读了几遍之后,我敢肯定你的面试官只是想把你弄糊涂。老实说,一种数据类型(数组)是多维的,而另一种数据类型(使用数组的
ArrayList
)是非多维的,这是没有意义的。

Cay S.Horstmann在他的《核心Java》一书中指出:

Java中没有二维数组列表,但可以声明
ArrayList类型的变量


为了更清楚地回答Java是否有真正的多维数组,我没有说Java没有多维数组,我说Java没有真正的多维数组,正如expect所说:

多维数组不需要同时具有相同长度的数组 每一级


出于同样的原因,我把所有备用购物袋放进的购物袋不是一个多维购物袋

如果我把一个坚果放在一个袋子里,然后把那个袋子放在另一个袋子里,我必须做两次手术才能得到坚果

如果我将螺母放在二维组件托盘中,我可以使用两个索引执行一个操作来访问它:

类似地,列表列表(或数组数组数组)和真正的二维数组之间有一个根本的区别——使用一个包含两个索引的操作访问二维数组中的元素,使用两个包含一个索引的操作访问列表中的元素

ArrayList只有一个索引,因此其排名为1。二维数组有两个索引,其秩为2


注意:我所说的“二维数组”不是指数组的Java数组,而是指其他语言(如FORTRAN)中的二维数组。Java没有多维数组。如果你的面试官特别提到Java的“数组数组”,那么我不同意,因为Java的
int[][]
定义了对整数数组的引用数组,这需要两个解引用操作来访问元素。例如,C中的数组数组支持通过单个解引用操作进行访问,因此更接近多维情况。

因为它根本不是多维的。它是一个具有API的对象。任何多维的外观都是由它的API提供的,但它完全是在旁观者的眼中。另一方面,数组是多维的,因此也可以是多维的。

采访者的说法是荒谬的

正如您在本页上看到的,有人可能会争辩说Java没有tru