java編程中拷貝數(shù)組的方式及相關(guān)問題分析
JAVA數(shù)組的復(fù)制是引用傳遞,而并不是其他語言的值傳遞。
這里介紹java數(shù)組復(fù)制的4種方式極其問題:
第一種方式利用for循環(huán):
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;
這里把a(bǔ)rray1數(shù)組的值復(fù)制給array2,如果你這樣去運(yùn)行,就會發(fā)現(xiàn)此時兩個數(shù)組的值是一樣的。這是傳遞的是引用(也就是地址),之后改變其中一個數(shù)組另一個也會跟著變化。
第三種方式:
利用Arrays自帶的copyof
int copy[] = Arrays.copyOf(a, a.length);
第四種方式:
這里再介紹一下System.arraycopy這個函數(shù),從JAVAAPI中找了一段。大家看一下。
publicstaticvoidarraycopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)從指定源數(shù)組中復(fù)制一個數(shù)組,復(fù)制從指定的位置開始,到目標(biāo)數(shù)組的指定位置結(jié)束。從src引用的源數(shù)組到dest引用的目標(biāo)數(shù)組,數(shù)組組件的一個子序列被復(fù)制下來。被復(fù)制的組件的編號等于length參數(shù)。源數(shù)組中位置在srcPos到srcPos+length-1之間的組件被分別復(fù)制到目標(biāo)數(shù)組中的destPos到destPos+length-1位置。
如果參數(shù)src和dest引用相同的數(shù)組對象,則復(fù)制的執(zhí)行過程就好像首先將srcPos到srcPos+length-1位置
的組件復(fù)制到一個帶有l(wèi)ength組件的臨時數(shù)組,然后再將此臨時數(shù)組的內(nèi)容復(fù)制到目標(biāo)數(shù)組的destPos到
destPos+length-1位置一樣。
If如果dest為null,則拋出NullPointerException異常。
如果src為null,則拋出NullPointerException異常,并且不會修改目標(biāo)數(shù)組。
否則,只要下列任何情況為真,則拋出ArrayStoreException異常并且不會修改目標(biāo)數(shù)組:
src參數(shù)指的是非數(shù)組對象。
dest參數(shù)指的是非數(shù)組對象。
src參數(shù)和dest參數(shù)指的是那些其組件類型為不同基本類型的數(shù)組。
src參數(shù)指的是具有基本組件類型的數(shù)組且dest參數(shù)指的是具有引用組件類型的數(shù)組。
src參數(shù)指的是具有引用組件類型的數(shù)組且dest參數(shù)指的是具有基本組件類型的數(shù)組。
否則,只要下列任何情況為真,則拋出IndexOutOfBoundsException異常,并且不會修改目標(biāo)數(shù)組:
srcPos參數(shù)為負(fù)。
destPos參數(shù)為負(fù)。
length參數(shù)為負(fù)。
srcPos+length大于src.length,即源數(shù)組的長度。
destPos+length大于dest.length,即目標(biāo)數(shù)組的長度。
否則,如果源數(shù)組中srcPos到srcPos+length-1位置上的實(shí)際組件通過分配轉(zhuǎn)換并不能轉(zhuǎn)換成目標(biāo)數(shù)組的組
件類型,則拋出ArrayStoreException異常。在這種情況下,將k設(shè)置為比長度小的最小非負(fù)整數(shù),這樣就
無法將src[srcPos+k]轉(zhuǎn)換為目標(biāo)數(shù)組的組件類型;當(dāng)拋出異常時,從srcPos到srcPos+k-1位置上的源數(shù)組
組件已經(jīng)被復(fù)制到目標(biāo)數(shù)組中的destPos到destPos+k-1位置,而目標(biāo)數(shù)組中的其他位置不會被修改。(因
為已經(jīng)詳細(xì)說明過的那些限制,只能將此段落有效地應(yīng)用于兩個數(shù)組都有引用類型的組件類型的情況。)
參數(shù):src-源數(shù)組。
srcPos-源數(shù)組中的起始位置。
dest-目標(biāo)數(shù)組。
destPos-
目標(biāo)數(shù)據(jù)中的起始位置。
length-
要復(fù)制的數(shù)組元素的數(shù)量。
拋出:IndexOutOfBoundsException-
如果復(fù)制會導(dǎo)致對數(shù)組范圍以外的數(shù)據(jù)的訪問。
ArrayStoreException-如果因?yàn)轭愋筒黄ヅ涠沟脽o法將src數(shù)組中的元素存儲到dest數(shù)組中。
NullPointerException-如果src或dest為null。
二維數(shù)組
不想匆匆了事,那就再介紹一下二維數(shù)組的聲明、初始化和引用吧。
二維數(shù)組的聲明、初始化和引用與一維數(shù)組相似:
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語言中,由于把二維數(shù)組看作是數(shù)組的數(shù)組,數(shù)組空間不是連續(xù)分配的,所以不要求二維數(shù)組每一維的大小相同。例如:
int intArray[ ][ ] = { {1,2}, {2,3}, {3,4,5} }; int a[ ][ ] = new int[2][ ]; a[0] = new int[3]; a[1] = new int[5];
【示例】通過二維數(shù)組計(jì)算兩個矩陣的乘積。
public class Demo { public static void main(String[] args){ // 第一個矩陣(動態(tài)初始化一個二維數(shù)組) int a[][] = new int[2][3]; // 第二個矩陣(靜態(tài)初始化一個二維數(shù)組) int b[][] = { {1,5,2,8}, {5,9,10,-3}, {2,7,-5,-18} }; // 結(jié)果矩陣 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); // 計(jì)算矩陣乘積 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]; } } // 輸出結(jié)算結(jié)果 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(); } } }
運(yùn)行結(jié)果:
25 65 14 -65
50 130 28 -130
總結(jié)
以上就是本文關(guān)于java編程中拷貝數(shù)組的方式及相關(guān)問題分析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
Java中的數(shù)組復(fù)制(clone與arraycopy)代碼詳解
如有不足之處,歡迎留言指出,期待您的寶貴意見!
相關(guān)文章
詳解如何通過Java實(shí)現(xiàn)壓縮PDF文檔
PDF文檔是我們?nèi)粘^k公中使用最頻繁的文檔格式。但因?yàn)榇蠖鄶?shù)PDF文檔都包含很多頁面圖像或大量圖片,這就導(dǎo)致PDF文檔過大,處理起來較為麻煩。本文將介紹如何通過Java應(yīng)用程序壓縮PDF文檔,需要的可以了解一下2022-12-12Java中定時任務(wù)的全方位場景實(shí)現(xiàn)思路分析
在開發(fā)過程中,根據(jù)需求和業(yè)務(wù)的不同經(jīng)常會有很多場景需要用到不同特性的定時任務(wù),本文將針對這些場景,提供不同的一個實(shí)現(xiàn)思路,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2023-12-12springboot + rabbitmq 如何實(shí)現(xiàn)消息確認(rèn)機(jī)制(踩坑經(jīng)驗(yàn))
這篇文章主要介紹了springboot + rabbitmq 如何實(shí)現(xiàn)消息確認(rèn)機(jī)制,本文給大家分享小編實(shí)際開發(fā)中的一點(diǎn)踩坑經(jīng)驗(yàn),內(nèi)容簡單易懂,需要的朋友可以參考下2020-07-07myeclipse開發(fā)servlet_動力節(jié)點(diǎn)Java學(xué)院整理
MyEclipse,是在eclipse基礎(chǔ)上加上自己的插件開發(fā)而成的功能強(qiáng)大的企業(yè)級集成開發(fā)環(huán)境,主要用于Java、Java EE以及移動應(yīng)用的開發(fā)。下面這篇文章主要給大家介紹了關(guān)于myeclipse開發(fā)servlet的相關(guān)資料,需要的朋友可以參考下。2017-07-07關(guān)于LinkedList集合對元素進(jìn)行增查刪操作
LinkedList集合內(nèi)部包含有兩個Node類型的first和last屬性維護(hù)一個雙向循環(huán)鏈表,在鏈表中的每一個元素都使用引用的方式來記住它的前一個元素和后一個元素,從而可以將所有的元素彼此連接起來,需要的朋友可以參考下2023-04-04