天天看點

我終于弄懂了arraycopy !

不詩意的女程式媛不是好廚師~

轉載請注明出處,From李詩雨—https://blog.csdn.net/cjm2484836553/article/details/104303960

最近在看ArrayList源碼時,多次遇到了System.arraycopy()這個函數,于是就索性把它好好的研究了一番,感覺整個研究過程還是挺有意義的,也有了新的了解和收獲,在此做個記錄。

讓我們先來看一下System.arraycopy()的源碼:

我終于弄懂了arraycopy !

不知道大家在看它的時候有沒有什麼疑問呢,如果有的話,不如看一下我加了注釋的源碼吧~

我終于弄懂了arraycopy !

如果看了我标的注釋,你還是有疑問,沒關系,我還有栗子(誰叫我是畫圖小能手呢):

再來看看吧~

我終于弄懂了arraycopy !
我終于弄懂了arraycopy !
我終于弄懂了arraycopy !

好的,通過上面搞笑的圖檔,我終于畫懂了arraycopy()。

如果你還有點懵懂,那要不你也動手畫一下,或許有不一樣的收獲哦~

最後,我們再來深入反思一下下面這一部分的代碼:

我終于弄懂了arraycopy !

為什麼這裡要 從後往前複制呢?

這一塊的代碼意思是:

當 src==dst ,即在同一個數組内進行複制 且 srcPos < dstPos < srcPos + length 時,要采用從後往前複制。

我們還是用圖來說話吧:

我終于弄懂了arraycopy !

由于這裡 dstPos 即使目标數組的位置,又是原數組的位置。它處于很尴尬的重合位置。

如果從先往後複制,

第①步 dst[2]=src[0]沒問題;

第②步 dst[3]=src[1]沒問題;

第③步 dst[4]=src[2] 有問題!因為【2】的位置已經改變了!

是以說,當在同一個數組内進行複制 且 srcPos < dstPos < srcPos + length 時,必須要采用從後往前的複制,才不會出現資料已經被修改的問題。

積累點滴,做好自己~