嗨,我正在尝试使用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的方式,是否有任何错误或可以避免调整大小?

最佳答案

arraycopy方法绝对不会更改其参数数组的大小。

这里发生的是您误解了多维数组在Java中的工作方式(据说)。

现实是Java数组本质上是一维的。例如,String[][]实际上是字符串数组的数组。当您使用arraycopy从一个String[][]复制到另一个时,您没有将引用复制到字符串。实际上,您实际上是在对String[]对象的引用进行浅表复制。在您的情况下,这就是根据您的数组思维模型来更改列数。

请记住,arraycopy方法只是对顶层数组进行浅表复制。它只是将String[][]视为String[]对象的数组……并将其引用从源数组复制到目标数组。

如果要保持列数相同,最简单的方法是使用嵌套的for循环复制元素。我希望,如果您对代码进行了概要分析,则会发现与进行数据库查询,2)通过结果集传输数据和3的开销相比,使用arraycopy节省的时间要少。 )将其复制到List中,然后4)调用toArray(...)

这是arraycopy方法的javadoc。请注意,这里没有提到调整大小。

09-25 15:32