一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java中的數組復制(clone與arraycopy)代碼詳解

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

2021-02-06 12:11_枸杞子_ Java教程

這篇文章主要介紹了Java中的數組復制(clone與arraycopy)代碼詳解,本文并未全部介紹數組復制的幾種方式,僅對clone和copy的相關內容進行了解析,具有一定參考價值,需要的朋友可以了解下。

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

1、clone

protectedObjectclone()

throwsCloneNotSupportedException創建并返回此對象的一個副本。“副本”的準確含義可能依賴于對象的類。這樣做的目的是,對于任何對象x,表達式:

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

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

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

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

按照慣例,此方法返回的對象應該獨立于該對象(正被復制的對象)。要獲得此獨立性,在super.clone返回對象之前,有必要對該對象的一個或多個字段進行修改。這通常意味著要復制包含正在被復制對象的內部“深層結構”的所有可變對象,并使用對副本的引用替換對這些對象的引用。如果一個類只包含基本字段或對不變對象的引用,那么通常不需要修改super.clone返回的對象中的字段。

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

Object類本身不實現接口Cloneable,所以在類為Object的對象上調用clone方法將會導致在運行時拋出異常。

返回:

此實例的一個副本。

拋出:

CloneNotSupportedException-如果對象的類不支持Cloneable接口,則重寫clone方法的子類也會拋出此異常,以指示無法復制某個實例。

1、克隆方法用于創建對象的拷貝,為了使用clone方法,類必須實現java.lang.Cloneable接口重寫protected方法clone,

如果沒有實現Clonebale接口會拋出CloneNotSupportedException。

2、在克隆java對象的時候不會調用構造器。

3、java提供一種叫淺拷貝(shallowcopy)的默認方式實現clone,創建好對象的副本后然后通過賦值拷貝內容,

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

因為發生在可變的字段上任何改變將反應到他們所引用的共同內容上。為了避免這種情況,需要對引用的內容進行深度克隆。

2、arraycopy

publicstaticvoidarraycopy(Objectsrc,

intsrcPos,

Objectdest,

intdestPos,

intlength)從指定源數組中復制一個數組,復制從指定的位置開始,到目標數組的指定位置結束。

從src引用的源數組到dest引用的目標數組,數組組件的一個子序列被復制下來。被復制的組件的編號等于

length參數。源數組中位置在srcPos到srcPos+length-1之間的組件被分別復制到目標數組中的destPos

到destPos+length-1位置。

如果參數src和dest引用相同的數組對象,則復制的執行過程就好像首先將srcPos到srcPos+length-1位置的組件復制到一個帶有length組件的臨時數組,然后再將此臨時數組的內容復制到目標數組的destPos到destPos+length-1位置一樣。

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

如果src為null,則拋出NullPointerException異常,并且不會修改目標數組。

否則,只要下列任何情況為真,則拋出ArrayStoreException異常并且不會修改目標數組:

src參數指的是非數組對象。

dest參數指的是非數組對象。

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

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

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

否則,只要下列任何情況為真,則拋出IndexOutOfBoundsException異常,并且不會修改目標數組:

srcPos參數為負。

destPos參數為負。

length參數為負。

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

destPos+length大于dest.length,即目標數組的長度。

否則,如果源數組中srcPos到srcPos+length-1位置上的實際組件通過分配轉換并不能轉換成目標數組的組件

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

將src[srcPos+k]轉換為目標數組的組件類型;當拋出異常時,從srcPos到srcPos+k-1位置上的源數組組件

已經被復制到目標數組中的destPos到destPos+k-1位置,而目標數組中的其他位置不會被修改。

(因為已經詳細說明過的那些限制,只能將此段落有效地應用于

兩個數組都有引用類型的組件類型的情況。)

參數:

src-源數組。

srcPos-源數組中的起始位置。

dest-目標數組。

destPos-目標數據中的起始位置。

length-要復制的數組元素的數量。

拋出:

IndexOutOfBoundsException-如果復制會導致對數組范圍以外的數據的訪問。

ArrayStoreException-如果因為類型不匹配而使得無法將src數組中的元素存儲到dest數組中。

NullPointerException-如果src或dest為null。

3、測試代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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////////////////////////////////////////////////////////////////
        //克隆一個數組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);
    }
}

測試結果:

?
1
2
3
4
5
6
7
F:\code\Java\Course\017_數組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

總結

以上就是本文關于Java中的數組復制(clone與arraycopy)代碼詳解的全部內容,希望對大家學習Java數組復制方面的內容有些許幫助。

原文鏈接:http://blog.csdn.net/qq_33605778/article/details/54730612

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青草视频网址 | 日韩毛片基地一区二区三区 | 欧美一区二区三区精品国产 | 四虎tv在线观看884aa | 加勒比一本大道香蕉在线视频 | www久久精品| 22sihu国产精品视频影视资讯 | 91免费播放 | 国产caonila在线观看 | 污黄漫 | 欧美在线视频 一区二区 | 校花被强迫np肉高h 校服下的白嫩小乳尖h1v1 | 久久亚洲精品AV无码四区 | 国产成人无精品久久久久国语 | 无人在线视频高清免费播放 | 久久久久综合 | 女明星放荡高h日常生活 | 三叶草私人研究所 | 国产va免费精品高清在线 | 日韩av线观看 | 四虎精品成人免费观看 | 国产专区亚洲欧美另类在线 | 女同性互吃奶乳免费视频 | 久久精品视在线观看85 | 日韩久久网 | 国产成人激情 | 国产夜趣福利第一视频 | 青草园网站在线观看 | 亚洲国产AV一区二区三区四区 | 国产午夜精品一区二区三区 | 日韩在线观看一区二区不卡视频 | 亚洲AV午夜精品麻豆AV | 色婷婷综合久久久 | 十六一下岁女子毛片免费 | chinese老头和老太交hd | 免费一级毛片在线播放放视频 | 亚洲成人精品久久 | 亚洲一区二区日韩欧美gif | 91超级碰| 国产成人精品本亚洲 | 男男双性生子产乳高辣h |