1. 程式人生 > >記錄一道題,這裡是個盲點

記錄一道題,這裡是個盲點

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效率是最差的.