摘要:相比遍歷復(fù)制,此方法更加高效。原因很簡單,該方法使用內(nèi)存塊整體讀取與復(fù)制,相比的遍歷尋址來說自然會快,不過這個速度優(yōu)勢在數(shù)組成員比較多的時候才會有較明顯的體現(xiàn)。下面貼出方法中關(guān)鍵部分的方法代碼
API使用場景
在JDK研發(fā)團隊的開發(fā)過程中,對集合的操作過程中常會使用到此方法。
API參數(shù)public static native void arraycopy( Object src, //源數(shù)組 int srcPos, //源數(shù)組的讀取起始位置 Object dest, //目標數(shù)組 int destPos, //目標數(shù)據(jù)中的寫入起始位置 int length //要復(fù)制的數(shù)組元素的數(shù)量 );Functions
將指定源數(shù)組的數(shù)組從指定位置復(fù)制到目標數(shù)組的指定位置。數(shù)組組件的子序列由src引用的源數(shù)組復(fù)制到dest引用的目標數(shù)組。復(fù)制的組件數(shù)等于length。源序列中從srcPos到srcPos+length-1的序列復(fù)制到目標序列的destPos到destPos+length-1位置。
如果src和dest參數(shù)引用的是相同的數(shù)組對象,則首先把源數(shù)組srcPos到srcPos+length-1的組件復(fù)制到具有與此相同長度的臨時數(shù)組里,然后再把臨時數(shù)組的內(nèi)容復(fù)制到目標數(shù)組destPos到destPos+length-1位置。
如果dest為null,則拋出NullPointerException;如果src為空,則拋出NullPointerException,并且不修改目標數(shù)組。
拋出ArrayStoreException的情況(前7種情況不會修改dest):
1)src參數(shù)指向的不是數(shù)組對象
2)dest參數(shù)指向的不是數(shù)組對象
3)src參數(shù)和dest參數(shù)指向的對象類型不是同一種基本類型的數(shù)組
4)src參數(shù)指向由原始組件類型組成的數(shù)組,dest參數(shù)指向由引用組件類型組成的數(shù)組
5)dest參數(shù)指向由原始組件類型組成的數(shù)組,src參數(shù)指向由引用組件類型組成的數(shù)組
6)srcPos+length>src.length
7)destPos+length>dest.length
8)對于任意i滿足:srcPos <= i <= (srcPos+length-1),src.get(i)無法轉(zhuǎn)換為dest的成員類型。(這種情況下,令k為小于length的非負整數(shù),假設(shè)此時使src[srcPos+k]不能轉(zhuǎn)換為目標數(shù)組的成員類型,當拋異常時srcPos到srcPos+k-1的源數(shù)組成員已經(jīng)通過destPos+k-1被復(fù)制到目標數(shù)組的destPos位置,目標數(shù)組的剩余位置不會被修改。這種情況僅適用于兩個數(shù)組都具有引用類型的成員類型的情況)
1、總的來說,復(fù)制方式屬于淺復(fù)制
復(fù)制的過程只是引用變量的二次傳遞。
一維數(shù)組的復(fù)制:屬性值傳遞,修改則不會影響副本
二維數(shù)組的復(fù)制:復(fù)制的是第一維的引用列表,副本和原數(shù)組的指向是相同的堆地址,這個時候,值變動的影響是雙向的
2、此方法不是線程安全的,必要時要加鎖限制。
3、相比for遍歷復(fù)制,此方法更加高效。
原因很簡單,該方法使用內(nèi)存塊整體讀取與復(fù)制,相比for的遍歷尋址來說自然會快,不過這個速度優(yōu)勢在數(shù)組成員比較多的時候才會有較明顯的體現(xiàn)。下面貼出native方法中關(guān)鍵部分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--); } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67899.html
摘要:集合之吃透增刪查改從源碼看初始化以及增刪查改,學(xué)習。一初始化無參的構(gòu)造器可以看到這個構(gòu)造器初始化了一個空數(shù)組。指定長度的構(gòu)造器這個構(gòu)造器顯式的指明了數(shù)組的長度,其實如果小于的話,在添加第一個元素的時候還是會擴充到長度為的數(shù)組。 Java集合之ArrayList - 吃透增刪查改 從源碼看初始化以及增刪查改,學(xué)習ArrayList。 先來看下ArrayList定義的幾個屬性: priva...
摘要:網(wǎng)站的面試專題學(xué)習筆記非可變性和對象引用輸出為,前后皆有空格。假定棧空間足夠的話,盡管遞歸調(diào)用比較難以調(diào)試,在語言中實現(xiàn)遞歸調(diào)用也是完全可行的。棧遵守規(guī)則,因此遞歸調(diào)用方法能夠記住調(diào)用者并且知道此輪執(zhí)行結(jié)束之返回至當初的被調(diào)用位置。 ImportNew 網(wǎng)站的Java面試專題學(xué)習筆記 1. 非可變性和對象引用 String s = Hello ; s += World ; s.tr...
摘要:源數(shù)組源數(shù)組要復(fù)制的起始位置目標數(shù)組將原數(shù)組復(fù)制到目標數(shù)組目標數(shù)組起始位置從目標數(shù)組的哪個下標開始復(fù)制操作復(fù)制源數(shù)組的長度例子如下源數(shù)組為目標數(shù)組為開始執(zhí)行數(shù)組復(fù)制操作將源數(shù)組從數(shù)組下標開始的位長度的數(shù)組復(fù)制到目標數(shù)組從下標為的位置開始復(fù)制 **/* * @param src the source array.源數(shù)組 * @param srcPos ...
摘要:二數(shù)組擴容及拷貝數(shù)組的擴容數(shù)組是根據(jù)固定容量創(chuàng)建的,在必要的時候我們需要對數(shù)組進行擴容初始長度為下面決定需要對數(shù)組進行擴容對原數(shù)組進行內(nèi)容拷貝在對數(shù)組進行拷貝時除了利用循環(huán)遍歷數(shù)組元素進行拷貝外,推薦使用更高效的方法。 PS:如果覺得文章有什么地方寫錯了,哪里寫得不好,或者有什么建議,歡迎指點。 一、認識數(shù)組 數(shù)組是一種線性表數(shù)據(jù)結(jié)構(gòu)。它用一塊連續(xù)的內(nèi)存空間,來存儲相同類型的一組數(shù)據(jù)。...
閱讀 1206·2021-11-24 11:16
閱讀 3435·2021-11-15 11:38
閱讀 1929·2021-10-20 13:47
閱讀 552·2021-09-29 09:35
閱讀 2199·2021-09-22 15:17
閱讀 1016·2021-09-07 09:59
閱讀 3387·2019-08-30 13:21
閱讀 2910·2019-08-30 12:47