用C/C++,能夠執行以下操作:複製1D陣列2D陣列
int arr[100];
int ar[10][10];
memcpy(ar, arr, sizeof(int)*100);
由於C/C++標準保證陣列是連續的,上述將一維數組複製到2D陣列。
這在Java中可能嗎?
用C/C++,能夠執行以下操作:複製1D陣列2D陣列
int arr[100];
int ar[10][10];
memcpy(ar, arr, sizeof(int)*100);
由於C/C++標準保證陣列是連續的,上述將一維數組複製到2D陣列。
這在Java中可能嗎?
這在Java中不可行,因爲Java中的多維數組實際上是一個數組數組。元素不存儲在連續的內存塊中。您將需要逐行復制元素。
例如,這裏有幾種可能的方法之一:
int arr[100] = . . .;
int ar[10][10] = new int[10][10];
int offset = 0;
for (int[] row : ar) {
System.arraycopy(arr, offset, row, 0, row.length);
offset += row.length;
}
從Java Language Specification, §15.10.1,這裏有評估數組創建表達式new int[10][10]
(尤其是最後一點注)時發生的步驟:
首先,從左到右評估維度表達式。如果任何表達式評估突然完成,則不會評估其右側的表達式。
接下來,檢查維度表達式的值。如果任何DimExpr表達式的值小於零,則拋出NegativeArraySizeException。
接下來,空間分配給新陣列。如果沒有足夠的空間分配數組,則通過拋出OutOfMemoryError突然完成數組創建表達式的求值。
然後,如果出現一個DimExpr,將創建一個指定長度的一維數組,並將該數組的每個組件初始化爲默認值(§4.12.5)。否則,如果出現n個DimExpr表達式,則數組創建將有效地執行一組深度爲n-1的嵌套循環,以創建隱含的數組數組。
不,你必須循環。如果有的話,Java保證100是連續的,但10x10不是。 Java的int [] []實際上是c的int **,而不是int [] []。 – Kevin
你有沒有嘗試java.lang.System.arraycopy? http://www.tutorialspoint.com/java/lang/system_arraycopy.htm – Brent
對於Java 7,而不是'System.arraycopy',你可以使用'java.util.Arrays.copyOfRange(...)'。這不會創建多維數組,但可以在循環中使用它。 – aliteralmind