Java System.arraycopy

Yake1965 2022-01-07 20:21:46 阅读数:651

java system.arraycopy arraycopy

Java System.arraycopy

從指定源數組中進行拷貝操作,可以指定開始比特置,拷貝指定長度的元素到指定目標數組中。該方法是一個本地靜態方法,聲明如下:

public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
src: the source array.
srcPos: source array index from where copy will start
dest: the destination array.
destPos: destination array index from where data will be copied.
length: the number of elements to copy.
import java.util.Arrays;
int[] source = {
 1, 2, 3, 4, 5, 6, 7 };
int[] destination = new int[5];
System.arraycopy(source, 3, destination, 2, 3); // 要複制的源數組中的元素為 4,5,6。 這些將從索引2開始複制到目標數組。
System.out.println(Arrays.toString(destination)); // [0, 0, 4, 5, 6]

當源和目標是相同的陣列時,將從源陣列創建一個臨時陣列。 然後將臨時數組中的元素複制到源數組。

int[] source = {
 1, 2, 3, 4, 5, 6, 7 };
System.arraycopy(source, 3, source, 5, 2);
System.out.println(Arrays.toString(source)); // [1, 2, 3, 4, 5, 4, 5]

arraycopy() 方法有5個參數。 因此,在許多情况下會發生异常。 此方法引發的异常是:

NullPointerException: if source or destination array is null.
ArrayStoreException: if the source and destination array type doesn’t match or they are not array.
ArrayIndexOutOfBoundsException: if the data overflow occurs because of index values or they are negative.

一般會有如下四種方式對數組進行拷貝:

  • for 遍曆,遍曆源數組並將每個元素賦給目標數組。
  • clone 方法,原數組調用 clone 方法克隆新對象賦給目標數組,更深入的克隆可以看之前的文章《從JDK角度看對象克隆》
  • System.arraycopy,JVM 提供的數組拷貝實現。
  • Arrays.copyof,實際也是調用 System.arraycopy。

System.arraycopy 為 JVM 內部固有方法,它通過手工編寫匯編或其他優化方法來進行 Java 數組拷貝,這種方式比起直接在 Java 上進行 for 循環或 clone 是更加高效的。數組越大體現地越明顯。

2022. 將一維數組轉變成二維數組

Leetcode
知識點: Array 複制的方法 for, System.arraycopy, Arrays.copyOfRange. 空數組。

class Solution {

public int[][] construct2DArray(int[] original, int m, int n) {

if (original.length != m * n) return new int[0][]; // new int[][]{};
int[][] res = new int[m][n];
// for (int i = 0; i < m; i++){

// for (int j = 0; j < n; j++){

// res[i][j] = original[i * n + j];
// }
// }
for (int i = 0; i < original.length; i += n) {

// System.arraycopy(original, i, res[i / n], 0, n);
res[i / n] = Arrays.copyOfRange(original, i, i + n);
}
return res;
}
}
版权声明:本文为[Yake1965]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201072021454720.html