欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java復(fù)制(拷貝)數(shù)組的4種方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan

 更新時(shí)間:2021年01月21日 10:55:00   作者:c語(yǔ)言中文網(wǎng)  
這篇文章主要介紹了Java復(fù)制(拷貝)數(shù)組的4種方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

所謂復(fù)制數(shù)組,是指將一個(gè)數(shù)組中的元素在另一個(gè)數(shù)組中進(jìn)行復(fù)制。本文主要介紹關(guān)于 Java 里面的數(shù)組復(fù)制(拷貝)的幾種方式和用法。

在 Java 中實(shí)現(xiàn)數(shù)組復(fù)制分別有以下 4 種方法:

  • Arrays 類(lèi)的 copyOf() 方法
  • Arrays 類(lèi)的 copyOfRange() 方法
  • System 類(lèi)的 arraycopy() 方法
  • Object 類(lèi)的 clone() 方法

下面來(lái)詳細(xì)介紹這 4 種方法的使用。

使用 copyOf() 方法和 copyOfRange() 方法

Arrays 類(lèi)的 copyOf() 方法與 copyOfRange() 方法都可實(shí)現(xiàn)對(duì)數(shù)組的復(fù)制。copyOf() 方法是復(fù)制數(shù)組至指定長(zhǎng)度,copyOfRange() 方法則將指定數(shù)組的指定長(zhǎng)度復(fù)制到一個(gè)新數(shù)組中。

1. 使用 copyOf() 方法對(duì)數(shù)組進(jìn)行復(fù)制

Arrays 類(lèi)的 copyOf() 方法的語(yǔ)法格式如下:

Arrays.copyOf(dataType[] srcArray,int length);

其中,srcArray 表示要進(jìn)行復(fù)制的數(shù)組,length 表示復(fù)制后的新數(shù)組的長(zhǎng)度。

使用這種方法復(fù)制數(shù)組時(shí),默認(rèn)從原數(shù)組的第一個(gè)元素(索引值為 0)開(kāi)始復(fù)制,目標(biāo)數(shù)組的長(zhǎng)度將為 length。如果 length 大于 srcArray.length,則目標(biāo)數(shù)組中采用默認(rèn)值填充;如果 length 小于 srcArray.length,則復(fù)制到第 length 個(gè)元素(索引值為 length-1)即止。

注意:目標(biāo)數(shù)組如果已經(jīng)存在,將會(huì)被重構(gòu)。

例 1

假設(shè)有一個(gè)數(shù)組中保存了 5 個(gè)成績(jī),現(xiàn)在需要在一個(gè)新數(shù)組中保存這 5 個(gè)成績(jī),同時(shí)留 3 個(gè)空余的元素供后期開(kāi)發(fā)使用。

使用 Arrays 類(lèi)的 CopyOf() 方法完成數(shù)組復(fù)制的代碼如下:

import java.util.Arrays;
public class Test19{
  public static void main(String[] args) {
    // 定義長(zhǎng)度為 5 的數(shù)組
    int scores[] = new int[]{57,81,68,75,91};
    // 輸出原數(shù)組
    System.out.println("原數(shù)組內(nèi)容如下:");
    // 循環(huán)遍歷原數(shù)組
    for(int i=0;i<scores.length;i++) {
      // 將數(shù)組元素輸出
      System.out.print(scores[i]+"\t");
    }
    // 定義一個(gè)新的數(shù)組,將 scores 數(shù)組中的 5 個(gè)元素復(fù)制過(guò)來(lái)
    // 同時(shí)留 3 個(gè)內(nèi)存空間供以后開(kāi)發(fā)使用
    int[] newScores = (int[])Arrays.copyOf(scores,8);
    System.out.println("\n復(fù)制的新數(shù)組內(nèi)容如下:");
    // 循環(huán)遍歷復(fù)制后的新數(shù)組
    for(int j=0;j<newScores.length;j++) {
      // 將新數(shù)組的元素輸出
      System.out.print(newScores[j]+"\t");
    }
  }
}

在上述代碼中,由于原數(shù)組 scores 的長(zhǎng)度為 5,而要復(fù)制的新數(shù)組 newScores 的長(zhǎng)度為 8,因此在將原數(shù)組中的 5 個(gè)元素復(fù)制完之后,會(huì)采用默認(rèn)值填充剩余 3 個(gè)元素的內(nèi)容。

因?yàn)樵瓟?shù)組 scores 的數(shù)據(jù)類(lèi)型為 int,而使用 Arrays.copyOf(scores,8) 方法復(fù)制數(shù)組之后返回的是 Object[] 類(lèi)型,因此需要將 Object[] 數(shù)據(jù)類(lèi)型強(qiáng)制轉(zhuǎn)換為 int[] 類(lèi)型。同時(shí),也正因?yàn)?scores 的數(shù)據(jù)類(lèi)型為 int,因此默認(rèn)值為 0。

運(yùn)行的結(jié)果如下所示。
原數(shù)組內(nèi)容如下:
57    81    68    75    91  
復(fù)制的新數(shù)組內(nèi)容如下:
57    81    68    75    91    0    0    0

2. 使用 CopyOfRange() 方法對(duì)數(shù)組進(jìn)行復(fù)制

Arrays 類(lèi)的 CopyOfRange() 方法是另一種復(fù)制數(shù)組的方法,其語(yǔ)法形式如下:

Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)

其中:

  • srcArray 表示原數(shù)組。
  • startIndex 表示開(kāi)始復(fù)制的起始索引,目標(biāo)數(shù)組中將包含起始索引對(duì)應(yīng)的元素,另外,startIndex 必須在 0 到 srcArray.length 之間。
  • endIndex 表示終止索引,目標(biāo)數(shù)組中將不包含終止索引對(duì)應(yīng)的元素,endIndex 必須大于等于 startIndex,可以大于 srcArray.length,如果大于 srcArray.length,則目標(biāo)數(shù)組中使用默認(rèn)值填充。

注意:目標(biāo)數(shù)組如果已經(jīng)存在,將會(huì)被重構(gòu)。

例 2

假設(shè)有一個(gè)名稱(chēng)為 scores 的數(shù)組其元素為 8 個(gè),現(xiàn)在需要定義一個(gè)名稱(chēng)為 newScores 的新數(shù)組。新數(shù)組的元素為 scores 數(shù)組的前 5 個(gè)元素,并且順序不變。

使用 Arrays 類(lèi) copyOfRange() 方法完成數(shù)組復(fù)制的代碼如下:

public class Test20 {
  public static void main(String[] args) {
    // 定義長(zhǎng)度為8的數(shù)組
    int scores[] = new int[] { 57, 81, 68, 75, 91, 66, 75, 84 };
    System.out.println("原數(shù)組內(nèi)容如下:");
    // 循環(huán)遍歷原數(shù)組
    for (int i = 0; i < scores.length; i++) {
      System.out.print(scores[i] + "\t");
    }
    // 復(fù)制原數(shù)組的前5個(gè)元素到newScores數(shù)組中
    int newScores[] = (int[]) Arrays.copyOfRange(scores, 0, 5);
    System.out.println("\n復(fù)制的新數(shù)組內(nèi)容如下:");
    // 循環(huán)遍歷目標(biāo)數(shù)組,即復(fù)制后的新數(shù)組
    for (int j = 0; j < newScores.length; j++) {
      System.out.print(newScores[j] + "\t");
    }
  }
}

在上述代碼中,原數(shù)組 scores 中包含有 8 個(gè)元素,使用 Arrays.copyOfRange() 方法可以將該數(shù)組復(fù)制到長(zhǎng)度為 5 的 newScores 數(shù)組中,截取 scores 數(shù)組的前 5 個(gè)元素即可。

該程序運(yùn)行結(jié)果如下所示。
原數(shù)組內(nèi)容如下:
57    81    68    75    91    66    75    84  
復(fù)制的新數(shù)組內(nèi)容如下:
57    81    68    75    91

使用 arraycopy() 方法

arraycopy() 方法位于 java.lang.System 類(lèi)中,其語(yǔ)法形式如下:

System.arraycopy(dataType[] srcArray,int srcIndex,int destArray,int destIndex,int length)

其中,srcArray 表示原數(shù)組;srcIndex 表示原數(shù)組中的起始索引;destArray 表示目標(biāo)數(shù)組;destIndex 表示目標(biāo)數(shù)組中的起始索引;length 表示要復(fù)制的數(shù)組長(zhǎng)度。

使用此方法復(fù)制數(shù)組時(shí),length+srcIndex 必須小于等于 srcArray.length,同時(shí) length+destIndex 必須小于等于 destArray.length。

注意:目標(biāo)數(shù)組必須已經(jīng)存在,且不會(huì)被重構(gòu),相當(dāng)于替換目標(biāo)數(shù)組中的部分元素。

例 3

假設(shè)在 scores 數(shù)組中保存了 8 名學(xué)生的成績(jī)信息,現(xiàn)在需要復(fù)制該數(shù)組從第二個(gè)元素開(kāi)始到結(jié)尾的所有元素到一個(gè)名稱(chēng)為 newScores 的數(shù)組中,長(zhǎng)度為 12。scores 數(shù)組中的元素在 newScores 數(shù)組中從第三個(gè)元素開(kāi)始排列。

使用 System.arraycopy() 方法來(lái)完成替換數(shù)組元素功能的代碼如下:

public class Test21 {
  public static void main(String[] args) {
    // 定義原數(shù)組,長(zhǎng)度為8
    int scores[] = new int[] { 100, 81, 68, 75, 91, 66, 75, 100 };
    // 定義目標(biāo)數(shù)組
    int newScores[] = new int[] { 80, 82, 71, 92, 68, 71, 87, 88, 81, 79, 90, 77 };
    System.out.println("原數(shù)組中的內(nèi)容如下:");
    // 遍歷原數(shù)組
    for (int i = 0; i < scores.length; i++) {
      System.out.print(scores[i] + "\t");
    }
    System.out.println("\n目標(biāo)數(shù)組中的內(nèi)容如下:");
    // 遍歷目標(biāo)數(shù)組
    for (int j = 0; j < newScores.length; j++) {
      System.out.print(newScores[j] + "\t");
    }
    System.arraycopy(scores, 0, newScores, 2, 8);
    // 復(fù)制原數(shù)組中的一部分到目標(biāo)數(shù)組中
    System.out.println("\n替換元素后的目標(biāo)數(shù)組內(nèi)容如下:");
    // 循環(huán)遍歷替換后的數(shù)組
    for (int k = 0; k < newScores.length; k++) {
      System.out.print(newScores[k] + "\t");
    }
  }
}

在該程序中,首先定義了一個(gè)包含有 8 個(gè)元素的 scores 數(shù)組,接著又定義了一個(gè)包含有 12 個(gè)元素的 newScores 數(shù)組,然后使用 for 循環(huán)分別遍歷這兩個(gè)數(shù)組,輸出數(shù)組中的元素。最后使用 System.arraycopy() 方法將 newScores 數(shù)組中從第三個(gè)元素開(kāi)始往后的 8 個(gè)元素替換為 scores 數(shù)組中的 8 個(gè)元素值。

該程序運(yùn)行的結(jié)果如下所示。
原數(shù)組中的內(nèi)容如下:
100    81    68    75    91    66    75    100  
目標(biāo)數(shù)組中的內(nèi)容如下:
80    82    71    92    68    71    87    88    81    79    90    77  
替換元素后的目標(biāo)數(shù)組內(nèi)容如下:
80    82    100    81    68    75    91    66    75    100    90    77  

注意:在使用 arraycopy() 方法時(shí)要注意,此方法的命名違背了 Java 的命名慣例。即第二個(gè)單詞 copy 的首字母沒(méi)有大寫(xiě),但按慣例寫(xiě)法應(yīng)該為 arrayCopy。請(qǐng)讀者在使用此方法時(shí)注意方法名的書(shū)寫(xiě)。

使用 clone() 方法

clone() 方法也可以實(shí)現(xiàn)復(fù)制數(shù)組。該方法是類(lèi) Object 中的方法,可以創(chuàng)建一個(gè)有單獨(dú)內(nèi)存空間的對(duì)象。因?yàn)閿?shù)組也是一個(gè) Object 類(lèi),因此也可以使用數(shù)組對(duì)象的 clone() 方法來(lái)復(fù)制數(shù)組。

clone() 方法的返回值是 Object 類(lèi)型,要使用強(qiáng)制類(lèi)型轉(zhuǎn)換為適當(dāng)?shù)念?lèi)型。其語(yǔ)法形式比較簡(jiǎn)單:

array_name.clone()

示例語(yǔ)句如下:

int[] targetArray=(int[])sourceArray.clone();

注意:目標(biāo)數(shù)組如果已經(jīng)存在,將會(huì)被重構(gòu)。
例 4
有一個(gè)長(zhǎng)度為 8 的 scores 數(shù)組,因?yàn)槌绦蛐枰?,現(xiàn)在要定義一個(gè)名稱(chēng)為 newScores 的數(shù)組來(lái)容納 scores 數(shù)組中的所有元素,可以使用 clone() 方法來(lái)將 scores 數(shù)組中的元素全部復(fù)制到 newScores 數(shù)組中。代碼如下:

public class Test22 {
  public static void main(String[] args) {
    // 定義原數(shù)組,長(zhǎng)度為8
    int scores[] = new int[] { 100, 81, 68, 75, 91, 66, 75, 100 };
    System.out.println("原數(shù)組中的內(nèi)容如下:");
    // 遍歷原數(shù)組
    for (int i = 0; i < scores.length; i++) {
      System.out.print(scores[i] + "\t");
    }
    // 復(fù)制數(shù)組,將Object類(lèi)型強(qiáng)制轉(zhuǎn)換為int[]類(lèi)型
    int newScores[] = (int[]) scores.clone();
    System.out.println("\n目標(biāo)數(shù)組內(nèi)容如下:");
    // 循環(huán)遍歷目標(biāo)數(shù)組
    for (int k = 0; k < newScores.length; k++) {
      System.out.print(newScores[k] + "\t");
    }
  }
}

在該程序中,首先定義了一個(gè)長(zhǎng)度為 8 的 scores 數(shù)組,并循環(huán)遍歷該數(shù)組輸出數(shù)組中的元素,然后定義了一個(gè)名稱(chēng)為 newScores 的新數(shù)組,并使用 scores.clone() 方法將 scores 數(shù)組中的元素復(fù)制給 newScores 數(shù)組。最后循環(huán)遍歷 newScores 數(shù)組,輸出數(shù)組元素。

程序運(yùn)行結(jié)果如下所示。
原數(shù)組中的內(nèi)容如下:
100    81    68    75    91    66    75    100  
目標(biāo)數(shù)組內(nèi)容如下:
100    81    68    75    91    66    75    100  
從運(yùn)行的結(jié)果可以看出,scores 數(shù)組的元素與 newScores 數(shù)組的元素是相同的。

注意:以上幾種方法都是淺拷貝(淺復(fù)制)。淺拷貝只是復(fù)制了對(duì)象的引用地址,兩個(gè)對(duì)象指向同一個(gè)內(nèi)存地址,所以修改其中任意的值,另一個(gè)值都會(huì)隨之變化。深拷貝是將對(duì)象及值復(fù)制過(guò)來(lái),兩個(gè)對(duì)象修改其中任意的值另一個(gè)值不會(huì)改變。

到此這篇關(guān)于Java復(fù)制(拷貝)數(shù)組的4種方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan的文章就介紹到這了,更多相關(guān)Java復(fù)制數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot集成kaptcha驗(yàn)證碼

    SpringBoot集成kaptcha驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了SpringBoot集成kaptcha驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • springboot 自定義屬性與加載@value示例詳解

    springboot 自定義屬性與加載@value示例詳解

    在SpringBoot框架中,自定義屬性通常通過(guò)application.properties文件配置,并使用@Value注解加載,雖然這是一種可行的方法,但存在一種更優(yōu)雅的實(shí)現(xiàn)方式,本文給大家介紹springboot 自定義屬性與加載@value的相關(guān)操作,感興趣的朋友一起看看吧
    2024-10-10
  • spring boot thymeleaf 圖片上傳web項(xiàng)目根目錄操作步驟

    spring boot thymeleaf 圖片上傳web項(xiàng)目根目錄操作步驟

    這篇文章主要介紹了spring boot thymeleaf 圖片上傳web項(xiàng)目根目錄步驟,本文給大家提到了thymeleaf的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2018-03-03
  • Java Scanner輸入兩個(gè)數(shù)組的方法

    Java Scanner輸入兩個(gè)數(shù)組的方法

    今天小編就為大家分享一篇Java Scanner輸入兩個(gè)數(shù)組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 優(yōu)雅地在Java 8中處理異常的方法詳解

    優(yōu)雅地在Java 8中處理異常的方法詳解

    異常處理是我們?cè)谌粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到的一種需求,下面這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅地在Java 8中處理異常的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們來(lái)一起看看吧
    2019-01-01
  • MyBatis啟動(dòng)時(shí)控制臺(tái)無(wú)限輸出日志的原因及解決辦法

    MyBatis啟動(dòng)時(shí)控制臺(tái)無(wú)限輸出日志的原因及解決辦法

    這篇文章主要介紹了MyBatis啟動(dòng)時(shí)控制臺(tái)無(wú)限輸出日志的原因及解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • SpringBoot接入輕量級(jí)分布式日志框架(GrayLog)的操作方法

    SpringBoot接入輕量級(jí)分布式日志框架(GrayLog)的操作方法

    這篇文章主要介紹了SpringBoot接入輕量級(jí)分布式日志框架(GrayLog)的方法,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • JavaFx 中創(chuàng)建計(jì)時(shí)器的步驟詳解

    JavaFx 中創(chuàng)建計(jì)時(shí)器的步驟詳解

    本文介紹了如何在JavaFx中創(chuàng)建計(jì)時(shí)器,通過(guò)創(chuàng)建計(jì)時(shí)器界面、編寫(xiě)計(jì)時(shí)器邏輯以及關(guān)聯(lián)計(jì)時(shí)器按鈕,我們可以快速實(shí)現(xiàn)一個(gè)靈活可靠的計(jì)時(shí)器組件,本文能夠幫助讀者在 JavaFx 中成功實(shí)現(xiàn)自己的計(jì)時(shí)器功能,感興趣的朋友一起看看吧
    2023-11-11
  • Springboot實(shí)現(xiàn)獲取實(shí)時(shí)天氣

    Springboot實(shí)現(xiàn)獲取實(shí)時(shí)天氣

    這篇文章主要為大家詳細(xì)介紹了如何使用Springboot實(shí)現(xiàn)獲取實(shí)時(shí)天氣功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Java類(lèi)加載之Class對(duì)象到Klass模型詳解

    Java類(lèi)加載之Class對(duì)象到Klass模型詳解

    這篇文章主要介紹了Java類(lèi)加載之Class對(duì)象到Klass模型詳解,每一個(gè)Java類(lèi)在JVM中都會(huì)對(duì)應(yīng)創(chuàng)建一個(gè)C++類(lèi)實(shí)例,我們稱(chēng)這個(gè)C++類(lèi)為Klass實(shí)例,Klass實(shí)例里面存儲(chǔ)了java類(lèi)中所描述的方法、字段、屬性等,需要的朋友可以參考下
    2023-08-08

最新評(píng)論