不詩意的女程式媛不是好廚師~
轉載請注明出處,From李詩雨—https://blog.csdn.net/cjm2484836553/article/details/104303960
最近在看ArrayList源碼時,多次遇到了System.arraycopy()這個函數,于是就索性把它好好的研究了一番,感覺整個研究過程還是挺有意義的,也有了新的了解和收獲,在此做個記錄。
讓我們先來看一下System.arraycopy()的源碼:
不知道大家在看它的時候有沒有什麼疑問呢,如果有的話,不如看一下我加了注釋的源碼吧~
如果看了我标的注釋,你還是有疑問,沒關系,我還有栗子(誰叫我是畫圖小能手呢):
再來看看吧~
好的,通過上面搞笑的圖檔,我終于畫懂了arraycopy()。
如果你還有點懵懂,那要不你也動手畫一下,或許有不一樣的收獲哦~
最後,我們再來深入反思一下下面這一部分的代碼:
為什麼這裡要 從後往前複制呢?
這一塊的代碼意思是:
當 src==dst ,即在同一個數組内進行複制 且 srcPos < dstPos < srcPos + length 時,要采用從後往前複制。
我們還是用圖來說話吧:
由于這裡 dstPos 即使目标數組的位置,又是原數組的位置。它處于很尴尬的重合位置。
如果從先往後複制,
第①步 dst[2]=src[0]沒問題;
第②步 dst[3]=src[1]沒問題;
第③步 dst[4]=src[2] 有問題!因為【2】的位置已經改變了!
是以說,當在同一個數組内進行複制 且 srcPos < dstPos < srcPos + length 時,必須要采用從後往前的複制,才不會出現資料已經被修改的問題。
積累點滴,做好自己~