不詩意的女程序媛不是好廚師~
轉(zhuǎn)載請注明出處蒲拉,F(xiàn)rom李詩雨—https://blog.csdn.net/cjm2484836553/article/details/104303960
最近在看ArrayList源碼時,多次遇到了System.arraycopy()這個函數(shù)痴腌,于是就索性把它好好的研究了一番雌团,感覺整個研究過程還是挺有意義的,也有了新的理解和收獲士聪,在此做個記錄锦援。
讓我們先來看一下System.arraycopy()的源碼:
不知道大家在看它的時候有沒有什么疑問呢,如果有的話剥悟,不如看一下我加了注釋的源碼吧~
如果看了我標的注釋灵寺,你還是有疑問,沒關(guān)系懦胞,我還有栗子(誰叫我是畫圖小能手呢):
再來看看吧~
好的替久,通過上面搞笑的圖片,我終于畫懂了arraycopy()躏尉。
如果你還有點懵懂蚯根,那要不你也動手畫一下,或許有不一樣的收獲哦~
最后,我們再來深入反思一下下面這一部分的代碼:
為什么這里要 從后往前復(fù)制呢颅拦?
這一塊的代碼意思是:
當 src==dst ,即在同一個數(shù)組內(nèi)進行復(fù)制 且 srcPos < dstPos < srcPos + length 時蒂誉,要采用從后往前復(fù)制。
我們還是用圖來說話吧:
由于這里 dstPos 即使目標數(shù)組的位置距帅,又是原數(shù)組的位置右锨。它處于很尷尬的重合位置。
如果從先往后復(fù)制碌秸,
第①步 dst[2]=src[0]沒問題绍移;
第②步 dst[3]=src[1]沒問題;
第③步 dst[4]=src[2] 有問題讥电!因為【2】的位置已經(jīng)改變了蹂窖!
所以說,當在同一個數(shù)組內(nèi)進行復(fù)制 且 srcPos < dstPos < srcPos + length 時恩敌,必須要采用從后往前的復(fù)制瞬测,才不會出現(xiàn)數(shù)據(jù)已經(jīng)被修改的問題。
積累點滴纠炮,做好自己~