記錄一道題,這裡是個盲點
A.for迴圈的話,很靈活,但是程式碼不夠簡潔.
B.System.arraycopy()原始碼。可以看到是native方法:native關鍵字說明其修飾的方法是一個原生態方法,方法對應的實現不是在當前檔案,而是在用其他語言(如C和C++)實現的檔案中。 可以將native方法比作Java程式同C程式的介面。
如果是複製一個一位陣列,那麼改變複製後的陣列並不影響原陣列。但是如果複製一個二維陣列,那麼改變其中任何一個數組,那麼另一個的值也發生了變化。開始不是很明白,後來上網查了查資料,理解了其中奧妙。
java其實沒有二維陣列的概念,平常實現的二維陣列只是元素是一維陣列的一維陣列,而陣列也是引用型別,繼承自Object類。陣列是new出來的。這些性質也就導致arraycopy()二維陣列時出現的問題。
如果是一維陣列,那麼元素都是基礎型別(如int,double等),使用arraycopy()方法後,是把原陣列的值傳給了新陣列,屬於值傳遞。而如果是二維陣列,陣列的第一維裝的是一個一維陣列的引用,第二維裡是元素數值。對二維陣列應用arraycopy()方法後,第一維的引用被複制給新陣列的第一維,也就是兩個陣列的第一維都指向相同的“那些陣列”。而這時改變其中任何一個數組的元素的值,其實都修改了“那些陣列”的元素的值,所以原陣列和新陣列的元素值都一樣了。
ublic static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length);
C.選項有誤,copyOf不是System的方法,而是Arrays的方法,下面是原始碼,可以看到本質上是呼叫的arraycopy方法。,那麼其效率必然是比不上 arraycopy的.
public
static
int
[] copyOf(
int
[] original,
int
newLength) {
int
[] copy =
new
int
[newLength];
System.arraycopy(original,
0
, copy,
0
,
Math.min(original.length, newLength));
return
copy;
}
D.clone的話,返回的是Object【】,需要強制轉換。 一般用clone效率是最差的.