复制一个数组。
问题的原因是需要复制一个数组,但不清楚应该如何实现。解决方法是使用Arrays类的copyOf方法来复制数组。
在Java中,如果想要复制一个数组,可以使用Arrays类的copyOf方法。例如,如果有一个数组a = {1,2,3,4,5},想要复制它,可以使用以下代码:
int[] b = Arrays.copyOf(a, a.length);
这样就可以将数组a的内容复制到数组b中。Arrays.copyOf方法的第一个参数是要复制的数组,第二个参数是复制后数组的长度。该方法会返回一个新的数组,其中包含了原始数组的所有元素。
根据官方文档,Arrays.copyOf方法在小数组上可能比a.clone()方法更快。两种方法都能够快速地复制数组元素,但是clone()方法返回的是一个Object类型,所以编译器需要插入一个隐式类型转换来将其转换为int[]类型。在字节码中可以看到这一点,大致如下所示:
ALOAD 1 INVOKEVIRTUAL [I.clone ()Ljava/lang/Object; CHECKCAST [I ASTORE 2
因此,如果想要复制一个数组,并且希望效率更高,可以使用Arrays.copyOf方法来代替a.clone()方法。
问题:如何复制一个数组?
解决方法:可以使用以下代码来复制一个数组:
int[] a = new int[]{1,2,3,4,5}; int[] b = a.clone();
讨论:
在讨论中,某些情况下了使用循环的方法,但是该方法对问题提出者并不适用。还某些情况下了类型转换是不必要的,而且使用克隆方法是复制数组的最佳方式。
另外,还某些情况下了一种特殊情况,即问题提出者的用例中需要将数组重复复制到同一个数组中,因此克隆方法并不适用。
问题提出者在问题中提到了“我有一个数组A,它不断地被更新”。这可能意味着他要将A重复地复制到B中。
如果由于findbugs的警告而采用这种方法,请不要忘记检查源数组是否为null。
然而,也有人指出这种解决方法是错误的,因为一旦B被更新,A也会被更新。
在Java中,要复制一个数组,可以使用System.arraycopy()方法或者使用clone()方法。System.arraycopy()方法是一个本地方法,它在底层使用了一些检查和操作来实现数组的复制。而clone()方法则是直接调用了Object类的clone()方法来复制数组。
对于大数组来说,使用System.arraycopy()方法可能更快一些,因为它只需要进行一次边界检查。而使用循环复制数组的方式,每次加载和存储元素都需要进行边界检查,这会带来额外的开销。但是对于小数组来说,由于System.arraycopy()方法在开始之前需要进行一些检查,循环复制数组的方式可能更快。
然而,使用clone()方法更容易阅读,并且比创建一个新数组并使用arraycopy()方法复制要少出错的机会。而且,clone()方法也是比较快的。
有人建议使用JMH来重新进行性能测试,因为他认为之前的测试结果不够准确。
总之,对于数组的复制问题,可以根据具体情况选择使用System.arraycopy()方法或者clone()方法来实现。性能方面的差异可能在大数组的情况下才会有所体现,对于大多数情况来说,代码的可读性和错误减少的机会更重要。