System.arraycopy用法

轉(zhuǎn)載自:http://qinheng053.blog.163.com/blog/static/873451120123921645688/

先看ArrayList源碼中數(shù)組復(fù)制的代碼:

其實(shí)ArrayList 就是一個(gè)數(shù)組的形式存放數(shù)據(jù)的. 沒有高深的地方.他的性能在于他的索引能力, 正因?yàn)樗菙?shù)組形式,所以索引元素的時(shí)候他表現(xiàn)得非常的快速成,所以查找的時(shí)候是非橙纾快的,但是插入或者刪除一條記錄就比較慢了匆背,試想一下, 只要知道這個(gè)元素的索引,E[2] 你看對像就出來了.這就是ArrayList 最突出的地方.

讓我們來看下ArrayList 內(nèi)部數(shù)組是如何自我Copy的.要想深入的了解他就必需要看他的API,add 方法與remove 方式.

看完后你就會(huì)對它有一個(gè)深刻的理解了.如下原碼:

Add 方法

public void add(int index, E element) {

if (index > size || index < 0)

throw new IndexOutOfBoundsException( "Index: "+index+", Size: "+size);

ensureCapacity(size+1); // Increments modCount!!

System.arraycopy(elementData, index, elementData, index + 1, size - index);

elementData[index] = element;

size++;

}

remove 方法

public E remove(int index) {

RangeCheck(index);

modCount++;

E oldValue = elementData[index];

int numMoved = size - index - 1;

if (numMoved > 0)

System.arraycopy(elementData, index+1, elementData, index, numMoved);

elementData[--size] = null; // Let gc do its work

return oldValue;

}

上述兩個(gè)方法足以讓你認(rèn)識(shí)他們了.他的主要執(zhí)行過程就在于數(shù)組對像的自我復(fù)制.System.arrayCopy. 這個(gè)方法是

System類中的一個(gè)JNI方式實(shí)現(xiàn)類.(JNI , Java Native Interface 故名思意,就是java 語言調(diào)其它語言的一個(gè)接口)

這個(gè)JNI的底層在不同的平臺(tái)上不一樣.打個(gè)比方windows 其實(shí)java的JNI就是調(diào)了dll . Unix 其實(shí)就是調(diào)了.so 共享庫. 做過C++的一定明白.這個(gè)暫且放一下,讓我們來關(guān)注一下arrayCopy 如何復(fù)制數(shù)組元素的. 如果有人對java 的JNI接口有興趣朋友,不防去Sun網(wǎng)站下它的源碼.嘎嘎. C代碼還是有點(diǎn)深度的.SCSL 源碼就能看到. 地址,

https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter

(說明:要注冊一個(gè)SUN的賬號(hào).才可以下載.)

在JAVA里面,可以用復(fù)制語句"A=B"給基本類型的數(shù)據(jù)傳遞值,但是如果A,B是兩個(gè)同類型的數(shù)組,復(fù)制就相當(dāng)于將一個(gè)數(shù)組變量的引用傳遞給另一個(gè)數(shù)組;如果一個(gè)數(shù)組發(fā)生改變,那么引用同一數(shù)組的變量也要發(fā)生改變.

以下是歸納的JAVA中復(fù)制數(shù)組的方法:

1.使用FOR循環(huán),將數(shù)組的每個(gè)元素復(fù)制或者復(fù)制指定元素,不過效率差一點(diǎn)

2.使用clone方法,得到數(shù)組的值,而不是引用,不能復(fù)制指定元素,靈活性差一點(diǎn)

3.使用System.arraycopy(src, srcPos, dest, destPos, length)方法,推薦使用

舉例:

1.使用FOR循環(huán)

int[] src={1,3,5,6,7,8};

int[] dest = new int[6];

for(int i=0;i<6;i++) dest[i] = src[i];

2.使用clone

int[] src={1,3,5,6,7,8};

int[] dest;

dest=(int[]) src.clone();//使用clone創(chuàng)建

副本,注意clone要使用強(qiáng)制轉(zhuǎn)換

3.使用System.arraycopy

int[] src={1,3,5,6,7,8};

int[] dest = new int[6];

System.arraycopy(src, 0, dest, 0, 6);

-------------------------------------------------------------------

System提供了一個(gè)靜態(tài)方法arraycopy(),我們可以使用它來實(shí)現(xiàn)數(shù)組之間的復(fù)制.

其函數(shù)原型是:

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

src:源數(shù)組; srcPos:源數(shù)組要復(fù)制的起始位置;

dest:目的數(shù)組; destPos:目的數(shù)組放置的起始位置;

length:復(fù)制的長度.

注意:src and dest都必須是同類型或者可以進(jìn)行轉(zhuǎn)換類型的數(shù)組.

有趣的是這個(gè)函數(shù)可以實(shí)現(xiàn)自己到自己復(fù)制,

比如:int[] fun ={0,1,2,3,4,5,6};

System.arraycopy(fun,0,fun,3,3);

則結(jié)果為:{0,1,2,0,1,2,6};

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痊末,一起剝皮案震驚了整個(gè)濱河市油昂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖戳表,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛛倦,死亡現(xiàn)場離奇詭異歌懒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)溯壶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門及皂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人且改,你說我怎么就攤上這事验烧。” “怎么了又跛?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵碍拆,是天一觀的道長。 經(jīng)常有香客問我慨蓝,道長感混,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任礼烈,我火速辦了婚禮弧满,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘济丘。我一直安慰自己谱秽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布摹迷。 她就那樣靜靜地躺著疟赊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峡碉。 梳的紋絲不亂的頭發(fā)上近哟,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音鲫寄,去河邊找鬼吉执。 笑死疯淫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的戳玫。 我是一名探鬼主播熙掺,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咕宿!你這毒婦竟也來了币绩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤府阀,失蹤者是張志新(化名)和其女友劉穎缆镣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體试浙,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡董瞻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了田巴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钠糊。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖壹哺,靈堂內(nèi)的尸體忽然破棺而出眠蚂,到底是詐尸還是另有隱情,我是刑警寧澤斗躏,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站昔脯,受9級(jí)特大地震影響啄糙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜云稚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一隧饼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧静陈,春花似錦燕雁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刑赶,卻和暖如春捏浊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撞叨。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工金踪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浊洞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓胡岔,卻偏偏與公主長得像法希,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子靶瘸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容