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

我最近参加了一次面试,面试官问了我一个关于和的问题。ArraysArrayList

他问我,如果数组的数组可以是多维的,那么为什么一个数组不是多维的呢?ArrayListArrayList

例如:

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

// Not multidimensional
ArrayList<ArrayList<Integer>> seq = new ArrayList<ArrayList<Integer>>(); 

任何人都可以帮助我理解这一点吗?


答案 1

Cay S. Horstmann在他的书《Core Java for the Impatient》中指出:

Java 中没有二维数组列表,但您可以声明一个类型的变量并自行构建行。ArrayList<ArrayList<Integer>>

由于s可以扩展和收缩并变得锯齿状而不是多维的事实,可以说它不是一个二维数组,多维意味着固定的行和列,因此为什么我也在评论中说明Java没有真正的多维数组,但这超出了你的问题范围。ArrayList

如果你很好奇为什么我说Java没有真正的多维数组,那么在C#中,多维数组和数组数组之间的差异有一个读数?


只是为了让我的答案更清楚地说明Java是否有真正的多维数组,我没有说Java没有多维数组,我说Java没有真正的多维数组,正如JLS所期望的那样:

多维数组不需要在每个级别上都有相同长度的数组。


答案 2

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

如果我把一个螺母放在一个袋子里,然后把那个袋子放在另一个袋子里,我必须执行两个操作才能得到坚果。

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

component tray

类似地,列表列表(或数组数组)和真正的二维数组之间有一个根本的区别 - 一个操作采用两个索引来访问二维数组中的元素,两个操作每个取一个索引用于访问列表列表中的元素。

ArrayList 具有单个索引,因此其等级为 1。二维数组有两个索引,其秩为 2。

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