Java System.arraycopy将目标大小调整为源大小?

时间:2014-07-30 13:00:48

标签: java memory

您好我正在尝试使用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的方式,有什么不对或者这个大小可以避免吗?

2 个答案:

答案 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以避免这种情况"调整大小"。