当前位置: 首页 > 面试题库 >

使用System.arraycopy(…)比for循环复制数组更好吗?

潘安邦
2023-03-14
问题内容

我想创建一个新的对象数组,将两个较小的数组放在一起。

它们不能为null,但大小可以为0。

我无法在这两种方式之间进行选择:它们是等效的还是效率更高的(例如system.arraycopy()复制整个块)?

MyObject[] things = new MyObject[publicThings.length+privateThings.length];
System.arraycopy(publicThings, 0, things, 0, publicThings.length);
System.arraycopy(privateThings, 0, things,  publicThings.length, privateThings.length);

要么

MyObject[] things = new MyObject[publicThings.length+privateThings.length];
for (int i = 0; i < things.length; i++) {
    if (i<publicThings.length){
        things[i] = publicThings[i]
    } else {
        things[i] = privateThings[i-publicThings.length]        
    }
}

唯一的区别是代码的外观吗?

编辑: 感谢链接的问题,但他们似乎有一个未解决的讨论:

是否真的更快it is not for native types:byte [],Object [],char
[]?在所有其他情况下,都将执行类型检查,这将是我的情况,因此是等效的…不?

在另一个链接的问题上,他们说the size matters a lot,对于大小大于24的system.arraycopy()胜出,对于小于10的情况,手动for循环更好。

现在我真的很困惑。


问题答案:
public void testHardCopyBytes()
{
    byte[] bytes = new byte[0x5000000]; /*~83mb buffer*/
    byte[] out = new byte[bytes.length];
    for(int i = 0; i < out.length; i++)
    {
        out[i] = bytes[i];
    }
}

public void testArrayCopyBytes()
{
    byte[] bytes = new byte[0x5000000]; /*~83mb buffer*/
    byte[] out = new byte[bytes.length];
    System.arraycopy(bytes, 0, out, 0, out.length);
}

我知道JUnit测试并不是最佳的基准测试,但是
testHardCopyBytes完成了0.157s,

testArrayCopyBytes 完成了0.086s。

我认为这取决于虚拟机,但看起来好像它复制内存块而不是复制单个数组元素。这将绝对提高性能

编辑:
看起来System.arraycopy的性能无处不在。当使用字符串而不是字节,并且数组很小(大小为10)时,我得到以下结果:

    String HC:  60306 ns
    String AC:  4812 ns
    byte HC:    4490 ns
    byte AC:    9945 ns

这是数组大小为0x1000000时的样子。看起来System.arraycopy肯定会赢得更大的数组。

    Strs HC:  51730575 ns
    Strs AC:  24033154 ns
    Bytes HC: 28521827 ns
    Bytes AC: 5264961 ns

多么奇特!

谢谢,达伦,指出引用的复制方式有所不同。这使这个问题变得更加有趣!



 类似资料:
  • 问题内容: 我看到了如下一行代码: 就我所知,我认为要能够以这种格式编写for循环,我们需要将“ words”作为实现Iterable接口并覆盖iterator()函数的类的实例。但是’words’是String数组类型,这对于循环格式如何正确? 有人可以给我一些提示吗? 问题答案: 从有关此主题的Java教程中: for-each构造也适用于数组,其中它隐藏索引变量而不是迭代器。以下方法返回in

  • 我如何比较用户输入的这些数组呢?

  • 我遇到了一个相当奇怪的问题,当我试图编码我的机器人的一个特定的部分!为了使其简单简短,我有一个包含各种属性的对象数组(参见代码中的示例)。我想要做的是获取数组中的所有特定属性(例如name)并将其打印到控制台中。我尝试使用一个简单的for循环进行循环,每一个成功的循环,我都要求控制台记录ArrayName[I].name!请参阅代码以获得澄清! 问题是它确实按预期记录了代码--例如,在本例中是Re

  • 问题内容: 我有两个排序列表,都以非降序排列。例如,我有一个包含元素的排序链表,另一个有元素的链表。 我需要在两个列表中都找到所有常见的元素。我知道我可以使用for循环和嵌套循环来迭代所有匹配项以找到相同的两个元素。但是,还有另一种方法可以使运行时间少于? 问题答案: 您可以在O(n)时间内完成。伪代码:

  • 问题内容: 我读到 增强的for循环 比普通的 for循环 更有效: http://developer.android.com/guide/practices/performance.html#foreach 当我搜索它们的效率之间的差异时,我发现的是:如果是普通的for循环,我们需要一个额外的步骤来找出数组的长度或大小等, 但这是唯一的原因,增强的for循环优于普通的for循环吗?在那种情况下,

  • 需要运行一个代码,该代码遍历从2到-number的数字,并在isPrime方法中给出一个关于输入数字的布尔值。不管我输入了什么,我总是得到“真”,7,28等等。