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