您好,登錄后才能下訂單哦!
JAVA數組的復制是引用傳遞,而并不是其他語言的值傳遞。
這里介紹java數組復制的4種方式極其問題:
第一種方式利用for循環:
int[] a={1,2,4,6}; int length=a.length; int[] b=new int[length]; for (int i = 0; i < length; i++) { b[i]=a[i]; }
第二種方式直接賦值:
int[] array1={1,2,4,6}; int[] array2=a;
這里把array1數組的值復制給array2,如果你這樣去運行,就會發現此時兩個數組的值是一樣的。這是傳遞的是引用(也就是地址),之后改變其中一個數組另一個也會跟著變化。
第三種方式:
利用Arrays自帶的copyof
int copy[] = Arrays.copyOf(a, a.length);
第四種方式:
這里再介紹一下System.arraycopy這個函數,從JAVAAPI中找了一段。大家看一下。
publicstaticvoidarraycopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)從指定源數組中復制一個數組,復制從指定的位置開始,到目標數組的指定位置結束。從src引用的源數組到dest引用的目標數組,數組組件的一個子序列被復制下來。被復制的組件的編號等于length參數。源數組中位置在srcPos到srcPos+length-1之間的組件被分別復制到目標數組中的destPos到destPos+length-1位置。
如果參數src和dest引用相同的數組對象,則復制的執行過程就好像首先將srcPos到srcPos+length-1位置
的組件復制到一個帶有length組件的臨時數組,然后再將此臨時數組的內容復制到目標數組的destPos到
destPos+length-1位置一樣。
If如果dest為null,則拋出NullPointerException異常。
如果src為null,則拋出NullPointerException異常,并且不會修改目標數組。
否則,只要下列任何情況為真,則拋出ArrayStoreException異常并且不會修改目標數組:
src參數指的是非數組對象。
dest參數指的是非數組對象。
src參數和dest參數指的是那些其組件類型為不同基本類型的數組。
src參數指的是具有基本組件類型的數組且dest參數指的是具有引用組件類型的數組。
src參數指的是具有引用組件類型的數組且dest參數指的是具有基本組件類型的數組。
否則,只要下列任何情況為真,則拋出IndexOutOfBoundsException異常,并且不會修改目標數組:
srcPos參數為負。
destPos參數為負。
length參數為負。
srcPos+length大于src.length,即源數組的長度。
destPos+length大于dest.length,即目標數組的長度。
否則,如果源數組中srcPos到srcPos+length-1位置上的實際組件通過分配轉換并不能轉換成目標數組的組
件類型,則拋出ArrayStoreException異常。在這種情況下,將k設置為比長度小的最小非負整數,這樣就
無法將src[srcPos+k]轉換為目標數組的組件類型;當拋出異常時,從srcPos到srcPos+k-1位置上的源數組
組件已經被復制到目標數組中的destPos到destPos+k-1位置,而目標數組中的其他位置不會被修改。(因
為已經詳細說明過的那些限制,只能將此段落有效地應用于兩個數組都有引用類型的組件類型的情況。)
參數:src-源數組。
srcPos-源數組中的起始位置。
dest-目標數組。
destPos-
目標數據中的起始位置。
length-
要復制的數組元素的數量。
拋出:IndexOutOfBoundsException-
如果復制會導致對數組范圍以外的數據的訪問。
ArrayStoreException-如果因為類型不匹配而使得無法將src數組中的元素存儲到dest數組中。
NullPointerException-如果src或dest為null。
二維數組
不想匆匆了事,那就再介紹一下二維數組的聲明、初始化和引用吧。
二維數組的聲明、初始化和引用與一維數組相似:
int intArray[ ][ ] = { {1,2}, {2,3}, {4,5} }; int a[ ][ ] = new int[2][3]; a[0][0] = 12; a[0][1] = 34; // ...... a[1][2] = 93;
Java語言中,由于把二維數組看作是數組的數組,數組空間不是連續分配的,所以不要求二維數組每一維的大小相同。例如:
int intArray[ ][ ] = { {1,2}, {2,3}, {3,4,5} }; int a[ ][ ] = new int[2][ ]; a[0] = new int[3]; a[1] = new int[5];
【示例】通過二維數組計算兩個矩陣的乘積。
public class Demo { public static void main(String[] args){ // 第一個矩陣(動態初始化一個二維數組) int a[][] = new int[2][3]; // 第二個矩陣(靜態初始化一個二維數組) int b[][] = { {1,5,2,8}, {5,9,10,-3}, {2,7,-5,-18} }; // 結果矩陣 int c[][] = new int[2][4]; // 初始化第一個矩陣 for (int i=0; i<2; i++) for (int j=0; j<3 ;j++) a[i][j] = (i+1) * (j+2); // 計算矩陣乘積 for (int i=0; i<2; i++){ for (int j=0; j<4; j++){ c[i][j]=0; for (int k=0; k<3; k++) c[i][j] += a[i][k] * b[k][j]; } } // 輸出結算結果 for (int i=0; i<2; i++){ for (int j=0; j<4; j++) System.out.printf("%-5d", c[i][j]); System.out.printlnwww.ymzxrj.com(); } } }
運行結果:
25 65 14 -65
50 130 28 -130
總結
以上就是本文關于java編程中拷貝數組的方式及相關問題分析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站:
java數組復制的四種方法效率對比
Java中的數組復制(clone與arraycopy)代碼詳解
淺談java中String的兩種賦值方式的區別
如有不足之處,歡迎留言指出,期待您的寶貴意見!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。