最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的數(shù)組復(fù)制(clone與arraycopy)代碼詳解

 更新時(shí)間:2017年11月17日 14:26:03   作者:_枸杞子_  
這篇文章主要介紹了Java中的數(shù)組復(fù)制(clone與arraycopy)代碼詳解,本文并未全部介紹數(shù)組復(fù)制的幾種方式,僅對(duì)clone和copy的相關(guān)內(nèi)容進(jìn)行了解析,具有一定參考價(jià)值,需要的朋友可以了解下。

JAVA數(shù)組的復(fù)制是引用傳遞,而并不是其他語言的值傳遞。

1、clone

protectedObjectclone()

throwsCloneNotSupportedException創(chuàng)建并返回此對(duì)象的一個(gè)副本?!案北尽钡臏?zhǔn)確含義可能依賴于對(duì)象的類。這樣做的目的是,對(duì)于任何對(duì)象x,表達(dá)式:

x.clone()!=x為true,表達(dá)式:

x.clone().getClass()==x.getClass()也為true,但這些并非必須要滿足的要求。一般情況下:

x.clone().equals(x)為true,但這并非必須要滿足的要求。

按照慣例,返回的對(duì)象應(yīng)該通過調(diào)用super.clone獲得。如果一個(gè)類及其所有的超類(Object除外)都遵守此約定,則x.clone().getClass()==x.getClass()。

按照慣例,此方法返回的對(duì)象應(yīng)該獨(dú)立于該對(duì)象(正被復(fù)制的對(duì)象)。要獲得此獨(dú)立性,在super.clone返回對(duì)象之前,有必要對(duì)該對(duì)象的一個(gè)或多個(gè)字段進(jìn)行修改。這通常意味著要復(fù)制包含正在被復(fù)制對(duì)象的內(nèi)部“深層結(jié)構(gòu)”的所有可變對(duì)象,并使用對(duì)副本的引用替換對(duì)這些對(duì)象的引用。如果一個(gè)類只包含基本字段或?qū)Σ蛔儗?duì)象的引用,那么通常不需要修改super.clone返回的對(duì)象中的字段。

Object類的clone方法執(zhí)行特定的復(fù)制操作。首先,如果此對(duì)象的類不能實(shí)現(xiàn)接口Cloneable,則會(huì)拋出CloneNotSupportedException。注意,所有的數(shù)組都被視為實(shí)現(xiàn)接口Cloneable。否則,此方法會(huì)創(chuàng)建此對(duì)象的類的一個(gè)新實(shí)例,并像通過分配那樣,嚴(yán)格使用此對(duì)象相應(yīng)字段的內(nèi)容初始化該對(duì)象的所有字段;這些字段的內(nèi)容沒有被自我復(fù)制。所以,此方法執(zhí)行的是該對(duì)象的“淺表復(fù)制”,而不“深層復(fù)制”操作。

Object類本身不實(shí)現(xiàn)接口Cloneable,所以在類為Object的對(duì)象上調(diào)用clone方法將會(huì)導(dǎo)致在運(yùn)行時(shí)拋出異常。

返回:

此實(shí)例的一個(gè)副本。

拋出:

CloneNotSupportedException-如果對(duì)象的類不支持Cloneable接口,則重寫clone方法的子類也會(huì)拋出此異常,以指示無法復(fù)制某個(gè)實(shí)例。

1、克隆方法用于創(chuàng)建對(duì)象的拷貝,為了使用clone方法,類必須實(shí)現(xiàn)java.lang.Cloneable接口重寫protected方法clone,

如果沒有實(shí)現(xiàn)Clonebale接口會(huì)拋出CloneNotSupportedException。

2、在克隆java對(duì)象的時(shí)候不會(huì)調(diào)用構(gòu)造器。

3、java提供一種叫淺拷貝(shallowcopy)的默認(rèn)方式實(shí)現(xiàn)clone,創(chuàng)建好對(duì)象的副本后然后通過賦值拷貝內(nèi)容,

意味著如果你的類包含引用類型,那么原始對(duì)象和克隆都將指向相同的引用內(nèi)容,這是很危險(xiǎn)的,

因?yàn)榘l(fā)生在可變的字段上任何改變將反應(yīng)到他們所引用的共同內(nèi)容上。為了避免這種情況,需要對(duì)引用的內(nèi)容進(jìn)行深度克隆。

2、arraycopy

publicstaticvoidarraycopy(Objectsrc,

intsrcPos,

Objectdest,

intdestPos,

intlength)從指定源數(shù)組中復(fù)制一個(gè)數(shù)組,復(fù)制從指定的位置開始,到目標(biāo)數(shù)組的指定位置結(jié)束。

從src引用的源數(shù)組到dest引用的目標(biāo)數(shù)組,數(shù)組組件的一個(gè)子序列被復(fù)制下來。被復(fù)制的組件的編號(hào)等于

length參數(shù)。源數(shù)組中位置在srcPos到srcPos+length-1之間的組件被分別復(fù)制到目標(biāo)數(shù)組中的destPos

到destPos+length-1位置。

如果參數(shù)src和dest引用相同的數(shù)組對(duì)象,則復(fù)制的執(zhí)行過程就好像首先將srcPos到srcPos+length-1位置的組件復(fù)制到一個(gè)帶有l(wèi)ength組件的臨時(shí)數(shù)組,然后再將此臨時(shí)數(shù)組的內(nèi)容復(fù)制到目標(biāo)數(shù)組的destPos到destPos+length-1位置一樣。

If如果dest為null,則拋出NullPointerException異常。

如果src為null,則拋出NullPointerException異常,并且不會(huì)修改目標(biāo)數(shù)組。

否則,只要下列任何情況為真,則拋出ArrayStoreException異常并且不會(huì)修改目標(biāo)數(shù)組:

src參數(shù)指的是非數(shù)組對(duì)象。

dest參數(shù)指的是非數(shù)組對(duì)象。

src參數(shù)和dest參數(shù)指的是那些其組件類型為不同基本類型的數(shù)組。

src參數(shù)指的是具有基本組件類型的數(shù)組且dest參數(shù)指的是具有引用組件類型的數(shù)組。

src參數(shù)指的是具有引用組件類型的數(shù)組且dest參數(shù)指的是具有基本組件類型的數(shù)組。

否則,只要下列任何情況為真,則拋出IndexOutOfBoundsException異常,并且不會(huì)修改目標(biāo)數(shù)組:

srcPos參數(shù)為負(fù)。

destPos參數(shù)為負(fù)。

length參數(shù)為負(fù)。

srcPos+length大于src.length,即源數(shù)組的長度。

destPos+length大于dest.length,即目標(biāo)數(shù)組的長度。

否則,如果源數(shù)組中srcPos到srcPos+length-1位置上的實(shí)際組件通過分配轉(zhuǎn)換并不能轉(zhuǎn)換成目標(biāo)數(shù)組的組件

類型,則拋出ArrayStoreException異常。在這種情況下,將k設(shè)置為比長度小的最小非負(fù)整數(shù),這樣就無法

將src[srcPos+k]轉(zhuǎn)換為目標(biāo)數(shù)組的組件類型;當(dāng)拋出異常時(shí),從srcPos到srcPos+k-1位置上的源數(shù)組組件

已經(jīng)被復(fù)制到目標(biāo)數(shù)組中的destPos到destPos+k-1位置,而目標(biāo)數(shù)組中的其他位置不會(huì)被修改。

(因?yàn)橐呀?jīng)詳細(xì)說明過的那些限制,只能將此段落有效地應(yīng)用于

兩個(gè)數(shù)組都有引用類型的組件類型的情況。)

參數(shù):

src-源數(shù)組。

srcPos-源數(shù)組中的起始位置。

dest-目標(biāo)數(shù)組。

destPos-目標(biāo)數(shù)據(jù)中的起始位置。

length-要復(fù)制的數(shù)組元素的數(shù)量。

拋出:

IndexOutOfBoundsException-如果復(fù)制會(huì)導(dǎo)致對(duì)數(shù)組范圍以外的數(shù)據(jù)的訪問。

ArrayStoreException-如果因?yàn)轭愋筒黄ヅ涠沟脽o法將src數(shù)組中的元素存儲(chǔ)到dest數(shù)組中。

NullPointerException-如果src或dest為null。

3、測試代碼

import java.util.Arrays;
public class TestCloneCopy 
{
	public static void outputArrays(int[] a) 
	  {
		for ( int i = 0; i < a.length; ++i ) 
		    {
			System.out.print(a[i] + "\t");
		}
		System.out.println();
	}
	public static void main(String[] args) 
	  {
		int[] ia = new int[10];
		Arrays.fill(ia,20);
		////////////////////////////////////////////////////////////////////clone//////////////////////////////////////////////////////////////// 
		//克隆一個(gè)數(shù)組ia 
		int[] ib = ia.clone();
		ib[5] = 11;
		TestClone.outputArrays(ib);
		TestClone.outputArrays(ia);
		///////////////////////////////////////////////////////////////arraycopy///////////////////////////////////////////////////// 
		int[] ic = new int[20];
		System.arraycopy(ib,0,ic,5,10);
		TestClone.outputArrays(ic);
	}
}

測試結(jié)果:

F:\code\Java\Course\017_數(shù)組CloneCopy>java TestCloneCopy 
20   20   20   20   20   11   20   20   20   20 
 
20   20   20   20   20   20   20   20   20   20 
 
0    0    0    0    0    20   20   20   20   20 
11   20   20   20   20   0    0    0    0    0 

總結(jié)

以上就是本文關(guān)于Java中的數(shù)組復(fù)制(clone與arraycopy)代碼詳解的全部內(nèi)容,希望對(duì)大家學(xué)習(xí)Java數(shù)組復(fù)制方面的內(nèi)容有些許幫助。

相關(guān)文章

  • Java8如何利用Lambda快速生成map、多層嵌套map

    Java8如何利用Lambda快速生成map、多層嵌套map

    這篇文章主要介紹了Java8如何利用Lambda快速生成map、多層嵌套map問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java基礎(chǔ)-Java變量的聲明和作用域

    Java基礎(chǔ)-Java變量的聲明和作用域

    這篇文章主要介紹了Java變量的聲明和作用域,變量其實(shí)就是內(nèi)存中的一個(gè)存儲(chǔ)空間,用來存儲(chǔ)數(shù)據(jù),具體的相關(guān)內(nèi)容,需要的小伙伴可以參考下面文章內(nèi)容
    2022-01-01
  • springBoot+mybatis-plus實(shí)現(xiàn)監(jiān)聽mysql數(shù)據(jù)庫的數(shù)據(jù)增刪改

    springBoot+mybatis-plus實(shí)現(xiàn)監(jiān)聽mysql數(shù)據(jù)庫的數(shù)據(jù)增刪改

    mybatis-plus技術(shù)是簡化了繁瑣的代碼操作,把增刪改查的語句都內(nèi)置了,直接調(diào)用就可以實(shí)現(xiàn)數(shù)據(jù)庫的增刪改查了,這篇文章主要給大家介紹了關(guān)于springBoot+mybatis-plus實(shí)現(xiàn)監(jiān)聽mysql數(shù)據(jù)庫數(shù)據(jù)增刪改的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 關(guān)于Mybatis中SQL節(jié)點(diǎn)的深入解析

    關(guān)于Mybatis中SQL節(jié)點(diǎn)的深入解析

    這篇文章主要給大家介紹了關(guān)于Mybatis中SQL節(jié)點(diǎn)的深入解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Maven Assembly實(shí)戰(zhàn)教程

    Maven Assembly實(shí)戰(zhàn)教程

    MavenAssembly插件用于創(chuàng)建可分發(fā)包,如JAR、ZIP或TAR文件,通過配置pom.xml,可以生成包含所有依賴的JAR文件或自定義格式的歸檔文件,示例展示了如何使用默認(rèn)描述符和自定義描述符創(chuàng)建JAR包,以及在多模塊項(xiàng)目中使用Assembly插件
    2024-12-12
  • 使用Sentinel實(shí)現(xiàn)流控和服務(wù)降級(jí)的代碼示例

    使用Sentinel實(shí)現(xiàn)流控和服務(wù)降級(jí)的代碼示例

    Sentinel是面向分布式、多語言異構(gòu)化服務(wù)架構(gòu)的流量治理組件,本文將詳細(xì)為大家介紹如何使用Sentinel實(shí)現(xiàn)流控和服務(wù)降級(jí),文中有相關(guān)的代碼示例,需要的朋友可以參考下
    2023-05-05
  • Python__雙劃線參數(shù)代碼實(shí)例解析

    Python__雙劃線參數(shù)代碼實(shí)例解析

    這篇文章主要介紹了python__雙劃線參數(shù)代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java枚舉類與注解,新手一篇搞定它

    Java枚舉類與注解,新手一篇搞定它

    枚舉類型是Java 5新增的特性,它是一種新的類型,允許用常量來表示特定的數(shù)據(jù)片斷,而且全部都以類型安全的形式來表示。由于Java 不支持多繼承,所以枚舉對(duì)象不能再繼承其他類(可以實(shí)現(xiàn)接口)
    2021-06-06
  • Spring Boot 初始化運(yùn)行特定方法解析

    Spring Boot 初始化運(yùn)行特定方法解析

    這篇文章主要介紹了Spring Boot 初始化運(yùn)行特定方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java程序員的10道常見的XML面試問答題(XML術(shù)語詳解)

    Java程序員的10道常見的XML面試問答題(XML術(shù)語詳解)

    包括web開發(fā)人員的Java面試在內(nèi)的各種面試中,XML面試題在各種編程工作的面試中很常見。XML是一種成熟的技術(shù),經(jīng)常作為從一個(gè)平臺(tái)到其他平臺(tái)傳輸數(shù)據(jù)的標(biāo)準(zhǔn)
    2014-04-04

最新評(píng)論

大连市| 安义县| 杨浦区| 剑河县| 建阳市| 太仓市| 新河县| 无锡市| 五大连池市| 沈阳市| 河津市| 宁晋县| 革吉县| 吐鲁番市| 瑞金市| 平远县| 罗江县| 广东省| 丰城市| 嘉祥县| 津市市| 永吉县| 大荔县| 丰顺县| 神池县| 乐山市| 博兴县| 曲周县| 伊通| 会同县| 搜索| 麦盖提县| 乐山市| 图们市| 万源市| 辽阳县| 南充市| 土默特右旗| 轮台县| 菏泽市| 晴隆县|