您好我正在尝试使用System.arraycopy将较小的数组复制到较大的数组。这确实有效,但目标会自动调整为源维度。
我必须将表格复制到一起打印数据。我想将表A中的3列复制到表C中,而在第二步表B中将第4列复制到C中的第4列。行数在所有情况下都相同。这个想法失败了,因为数组副本似乎强制执行目标上的源维度。这有点出乎意料。
我不想迭代,因为如果我使用生产大小数据(> 100万或更多行),这将花费很长时间。我认为arracopy将是一个很好的快速解决方案....任何工作?
public class Test {
public static void main(String[] args) {
Integer[][] s = new Integer[2][2];
Integer[][] d = new Integer[3][3];
System.out.println(d.length + " " + d[0].length);
System.arraycopy(s, 0, d, 0, 2);
System.out.println(d.length + " " + d[0].length);
}
}
这就是我调用API的方式,有什么不对或者这个大小可以避免吗?
答案 0 :(得分:1)
arraycopy
方法肯定不会改变其参数数组的大小。
这里发生的是你误解了多维数组在Java中是如何工作的。(/ p>
现实情况是Java数组本质上是一维的。例如,String[][]
实际上是一个字符串数组的数组。当您使用arraycopy
从一个String[][]
复制到另一个String[]
时,您不会复制对字符串的引用。而是实际上您正在执行对arraycopy
对象的引用的浅拷贝。在你的情况下,根据你的数组心理模型改变列数。
请记住,String[][]
方法只是执行顶级数组的浅副本。它只是将String[]
视为for
个对象的数组......并将它们的引用从源数组复制到目标数组。
如果要保持列数相同,最简单的方法是使用嵌套的arraycopy
循环复制元素。我希望如果您对代码进行了分析,您会发现使用List
保存的时间与1)执行数据库查询,2)通过结果集传输数据的开销相比较小。 3)将其复制到toArray(...)
和4 arraycopy
电话。
以下是{{1}}方法的javadoc。请注意,没有提及调整大小。
答案 1 :(得分:1)
你的"调整大小"来自你复制2D数组的事实。什么都没有调整大小,它被覆盖了。
s[0] = new Integer[2];
// Arraycopy copies s[0] to d[0]
d[0] = s[0]; // Therefore d[0] = new Integer[2];
你必须迭代外部数组并为每个第二级数组执行arraycopy以避免这种情况"调整大小"。