复制一个数组。

11 浏览
0 Comments

复制一个数组。

我有一个不断更新的数组a。假设a = [1,2,3,4,5]。我需要创建一个完全相同的副本a,并将其命名为b。如果a变为[6,7,8,9,10],b仍然应该是[1,2,3,4,5]。最好的方法是什么?我尝试了一个for循环,像这样:\nfor(int i=0; i<5; i++) {\n b[i]=a[i];\n}\n但是似乎不起作用。请不要使用像深复制等高级术语,因为我不知道那是什么意思。

0
0 Comments

问题的原因是需要复制一个数组,但不清楚应该如何实现。解决方法是使用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()方法。

0
0 Comments

问题:如何复制一个数组?

解决方法:可以使用以下代码来复制一个数组:

int[] a = new int[]{1,2,3,4,5};
int[] b = a.clone();

讨论:

在讨论中,某些情况下了使用循环的方法,但是该方法对问题提出者并不适用。还某些情况下了类型转换是不必要的,而且使用克隆方法是复制数组的最佳方式。

另外,还某些情况下了一种特殊情况,即问题提出者的用例中需要将数组重复复制到同一个数组中,因此克隆方法并不适用。

问题提出者在问题中提到了“我有一个数组A,它不断地被更新”。这可能意味着他要将A重复地复制到B中。

如果由于findbugs的警告而采用这种方法,请不要忘记检查源数组是否为null。

然而,也有人指出这种解决方法是错误的,因为一旦B被更新,A也会被更新。

0
0 Comments

在Java中,要复制一个数组,可以使用System.arraycopy()方法或者使用clone()方法。System.arraycopy()方法是一个本地方法,它在底层使用了一些检查和操作来实现数组的复制。而clone()方法则是直接调用了Object类的clone()方法来复制数组。

对于大数组来说,使用System.arraycopy()方法可能更快一些,因为它只需要进行一次边界检查。而使用循环复制数组的方式,每次加载和存储元素都需要进行边界检查,这会带来额外的开销。但是对于小数组来说,由于System.arraycopy()方法在开始之前需要进行一些检查,循环复制数组的方式可能更快。

然而,使用clone()方法更容易阅读,并且比创建一个新数组并使用arraycopy()方法复制要少出错的机会。而且,clone()方法也是比较快的。

有人建议使用JMH来重新进行性能测试,因为他认为之前的测试结果不够准确。

总之,对于数组的复制问题,可以根据具体情况选择使用System.arraycopy()方法或者clone()方法来实现。性能方面的差异可能在大数组的情况下才会有所体现,对于大多数情况来说,代码的可读性和错误减少的机会更重要。

0