摘要:相比遍歷復制,此方法更加高效。原因很簡單,該方法使用內存塊整體讀取與復制,相比的遍歷尋址來說自然會快,不過這個速度優勢在數組成員比較多的時候才會有較明顯的體現。下面貼出方法中關鍵部分的方法代碼
API使用場景
在JDK研發團隊的開發過程中,對集合的操作過程中常會使用到此方法。
API參數public static native void arraycopy( Object src, //源數組 int srcPos, //源數組的讀取起始位置 Object dest, //目標數組 int destPos, //目標數據中的寫入起始位置 int length //要復制的數組元素的數量 );Functions
將指定源數組的數組從指定位置復制到目標數組的指定位置。數組組件的子序列由src引用的源數組復制到dest引用的目標數組。復制的組件數等于length。源序列中從srcPos到srcPos+length-1的序列復制到目標序列的destPos到destPos+length-1位置。
如果src和dest參數引用的是相同的數組對象,則首先把源數組srcPos到srcPos+length-1的組件復制到具有與此相同長度的臨時數組里,然后再把臨時數組的內容復制到目標數組destPos到destPos+length-1位置。
如果dest為null,則拋出NullPointerException;如果src為空,則拋出NullPointerException,并且不修改目標數組。
拋出ArrayStoreException的情況(前7種情況不會修改dest):
1)src參數指向的不是數組對象
2)dest參數指向的不是數組對象
3)src參數和dest參數指向的對象類型不是同一種基本類型的數組
4)src參數指向由原始組件類型組成的數組,dest參數指向由引用組件類型組成的數組
5)dest參數指向由原始組件類型組成的數組,src參數指向由引用組件類型組成的數組
6)srcPos+length>src.length
7)destPos+length>dest.length
8)對于任意i滿足:srcPos <= i <= (srcPos+length-1),src.get(i)無法轉換為dest的成員類型。(這種情況下,令k為小于length的非負整數,假設此時使src[srcPos+k]不能轉換為目標數組的成員類型,當拋異常時srcPos到srcPos+k-1的源數組成員已經通過destPos+k-1被復制到目標數組的destPos位置,目標數組的剩余位置不會被修改。這種情況僅適用于兩個數組都具有引用類型的成員類型的情況)
1、總的來說,復制方式屬于淺復制
復制的過程只是引用變量的二次傳遞。
一維數組的復制:屬性值傳遞,修改則不會影響副本
二維數組的復制:復制的是第一維的引用列表,副本和原數組的指向是相同的堆地址,這個時候,值變動的影響是雙向的
2、此方法不是線程安全的,必要時要加鎖限制。
3、相比for遍歷復制,此方法更加高效。
原因很簡單,該方法使用內存塊整體讀取與復制,相比for的遍歷尋址來說自然會快,不過這個速度優勢在數組成員比較多的時候才會有較明顯的體現。下面貼出native方法中關鍵部分copy的方法c++代碼:
void _Copy_conjoint_jints_atomic(jint* from, jint* to, size_t count) { if (from > to) { jint *end = from + count; while (from < end) *(to++) = *(from++); } else if (from < to) { jint *end = from; from += count - 1; to += count - 1; while (from >= end) *(to--) = *(from--); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67899.html
摘要:集合之吃透增刪查改從源碼看初始化以及增刪查改,學習。一初始化無參的構造器可以看到這個構造器初始化了一個空數組。指定長度的構造器這個構造器顯式的指明了數組的長度,其實如果小于的話,在添加第一個元素的時候還是會擴充到長度為的數組。 Java集合之ArrayList - 吃透增刪查改 從源碼看初始化以及增刪查改,學習ArrayList。 先來看下ArrayList定義的幾個屬性: priva...
摘要:網站的面試專題學習筆記非可變性和對象引用輸出為,前后皆有空格。假定棧空間足夠的話,盡管遞歸調用比較難以調試,在語言中實現遞歸調用也是完全可行的。棧遵守規則,因此遞歸調用方法能夠記住調用者并且知道此輪執行結束之返回至當初的被調用位置。 ImportNew 網站的Java面試專題學習筆記 1. 非可變性和對象引用 String s = Hello ; s += World ; s.tr...
摘要:源數組源數組要復制的起始位置目標數組將原數組復制到目標數組目標數組起始位置從目標數組的哪個下標開始復制操作復制源數組的長度例子如下源數組為目標數組為開始執行數組復制操作將源數組從數組下標開始的位長度的數組復制到目標數組從下標為的位置開始復制 **/* * @param src the source array.源數組 * @param srcPos ...
閱讀 1207·2021-11-24 11:16
閱讀 3437·2021-11-15 11:38
閱讀 1937·2021-10-20 13:47
閱讀 553·2021-09-29 09:35
閱讀 2202·2021-09-22 15:17
閱讀 1017·2021-09-07 09:59
閱讀 3390·2019-08-30 13:21
閱讀 2912·2019-08-30 12:47