System. arraycopy()入門指南

System. arraycopy()入門指南

System. arraycopy()源碼

System. arraycopy()入門指南

從它的修飾符native來看,這個方法的源碼是不能透漏給開發者來看的,因為native修改的方法,是由其它語言來實現的,一般是(C或C++),所以這沒有辦法看到源碼了。

其實我們對於這個方法也不需要了解太多,只要知道它的基本使用就可以了,也就是知道arraycopy()方法裡面的幾個參數都是什麼作用就好了

  • src參數:源數組
  • srcPos參數:從src數組的第幾個元素開始賦值
  • dest參數:目標數組
  • destPos參數:指定從dest數組的第幾個元素開始。
  • length參數:指定從src數組拿幾個元素來賦值到dest數組

System. arraycopy()複製基本數據類型

這裡以int為標準,代碼如下所示

System. arraycopy()入門指南

此時結果如下所示,可以看到上面的代碼把src_arr數組從索引1開始把2個長度的22,33這兩個元素給放到dest_arr數組裡面的從索引2開始的索引2和索引3這兩個位置上面

System. arraycopy()入門指南

System. arraycopy()複製引用數據類型

代碼如下所示

System. arraycopy()入門指南

然後此時運行結果如下所示,這裡結果就不多講了,也是複製成功的

System. arraycopy()入門指南

System. arraycopy()複製引用數據類型的淺拷貝問題

當使用System. arraycopy()進行復制的時候,拷貝數組裡面的引用對象的時候,是淺拷貝,而不是深拷貝,證明如下

System. arraycopy()入門指南

結果如下所示,此時可以看到dest_arr數組裡面的person對象的company變量和src_arr數組裡面的person對象的company變量是指向同一個地址的,說明在複製的時候,沒有把src_arr數組裡面的person對象的company變量在重新生成一個對象,所以此時是淺拷貝

System. arraycopy()入門指南

既然是淺拷貝了,那麼就會有一定的缺點,就是如果此時我修改src_arr數組裡面的person對象的company變量裡面的address變量地址,那麼dest_arr數組裡面的person對象的company變量的address變量地址也會修改了

比如下面的代碼

System. arraycopy()入門指南

此時可以看到兩次的獲取dest_arr數組裡面的person對象的company變量的address的值不同了

System. arraycopy()入門指南

System. arraycopy()複製引用數據類型變成深拷貝

目前發現System. arraycopy()複製引用數據類型無法實現深入拷貝,所以目前實現數組的深拷貝的代碼如下所示

System. arraycopy()入門指南

結果如下所示,此時可以看到,dest_arr數組裡面的person對象的company變量和src_arr數組裡面的person對象的company變量是不指向同一個地址的,所以此時對數組裡面的引用數據類型是深入拷貝

System. arraycopy()入門指南


分享到:


相關文章: