【问题标题】:Need some help to demystify System.arraycopy [closed]需要一些帮助来揭开 System.arraycopy 的神秘面纱 [关闭]
【发布时间】:2020-04-29 23:55:48
【问题描述】:

我正在阅读 Java 完整参考书,在那里我遇到了以下代码示例,我希望输出为 AAAAAAAAAA(10 次),但我将数组右旋了一个。

this thread 开发人员说

不同之处在于 Arrays.copyOf 不仅复制元素,还创建一个新数组。 System.arraycopy 复制到现有数组中。

但输出说明了其他内容。

public class TestClass {
    public static void main(String[] args) {
        byte a[] = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74 };
        System.arraycopy(a, 0, a, 1, a.length - 1);
        System.out.println(new String(a));
    }
}

为什么我期待 AAAAAAAAAA

在 0 处选择 A,在 1 处选择 A -> AACDEFGHIJ

在 1 处选择 A,在 2 处选择 A -> AAADEFGHIJ

....

......

PS:原来 System.arraycopy 可用于有效地旋转(移位)任何类型的数组。

【问题讨论】:

标签: java


【解决方案1】:

System.arraycopy 的调用只是将数组中元素 0 和倒数第二个元素之间的部分复制到数组中,从元素 1 开始。

System.arraycopy(a, 0, a, 1, a.length - 1);
              // ^                          Copy a portion of array a
              //    ^                       starting at position zero
              //             ^              for this many elements.
              //       ^                    into array a
              //          ^                 starting writing at position 1

所以它被覆盖了

[65, 66, 67, 68, 69, 70, 71, 72, 73, 74]

     65, 66, 67, 68, 69, 70, 71, 72, 73

你最终得到

[65, 65, 66, 67, 68, 69, 70, 71, 72, 73]

如果你再这样做,你就会有

[65, 65, 65, 66, 67, 68, 69, 70, 71, 72]

一次又一次

[65, 65, 65, 65, 66, 67, 68, 69, 70, 71]

...但是如果您希望整个数组为65,则必须继续这样做(您也可以只填充数组)。

【讨论】:

  • 是的,这就是我们想要的结果,因为我第一次访问了上面提到的线程,他们在没有创建中间数组的情况下就地复制了,感谢您的抽象。
猜你喜欢
  • 2018-04-17
  • 1970-01-01
  • 2020-11-08
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2012-11-08
相关资源
最近更新 更多