toArray方法参数作用及二维数组赋值相关疑问
嘿,我来帮你把这两个问题掰扯明白,看完你就通透了~
问题1:为什么二维数组的
array[y]看起来是一维数组? 首先得搞懂Java里二维数组的本质——它其实是「数组的数组」。你声明的Integer array[][],可以理解成一个存放一维Integer数组的数组。
举个例子:array本身是一个数组,它的每个元素(也就是array[0]、array[1]...array[y])都是一个独立的一维Integer[]数组。而你的square是多维ArrayList,也就是ArrayList<ArrayList<Integer>>,里面的每个元素square.get(y)都是一个ArrayList<Integer>(一维的列表),所以把它转成一维数组Integer[],再赋值给array[y],完全是匹配的——这就是为啥array[y]看起来是一维数组,因为它本来就是二维数组里的“子数组”呀!
问题2:
toArray(new Integer [testing2.size()])这个参数的作用是什么? Java中ArrayList的toArray()方法有两个常用重载:
- 无参的
toArray():返回的是Object[]类型,之后你需要手动强转成Integer[],不仅麻烦还容易出类型转换异常。 - 带参数的
toArray(T[] a):就是你代码里用的这个,它的核心作用有两个:- 指定返回数组的类型:传入
Integer[]类型的数组,方法会返回同样类型的数组,不用再强转,类型更安全。 - 控制数组的复用与创建:当你传入的数组长度等于
ArrayList的大小(像你这里testing2.size()刚好和列表长度一致),方法会直接把列表里的元素填充到你传入的这个数组里,然后返回它,避免额外创建新数组,提升性能。如果传入的数组长度小于列表大小,方法会自动创建一个新的、长度等于列表大小的同类型数组来装元素;如果长度大于列表大小,填充完元素后,剩下的位置会被设为null。
- 指定返回数组的类型:传入
你代码里这么写刚好完美匹配:用和列表一样长的Integer[]来接收元素,既保证了类型正确,又高效复用了数组。
最后贴一下格式化后的代码,看起来更清晰:
Integer array[][] = new Integer[testing.size()][]; for (int y = 0; y < testing.size(); y++) { ArrayList<Integer> testing2 = square.get(y); array[y] = testing2.toArray(new Integer[testing2.size()]); }
内容的提问来源于stack exchange,提问作者Hasnain Ali
相关产品推荐
相关产品推荐

