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