亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Java數(shù)組擴容縮容與拷貝的實現(xiàn)和原理

 更新時間:2023年05月16日 09:32:31   作者:一一哥Sun  
這篇文章主要帶大家學(xué)習(xí)數(shù)組的擴容、縮容及拷貝,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一. 數(shù)組內(nèi)存分析(重點)

1. 簡介

Java的內(nèi)存,可以分為棧、堆、方法區(qū)、本地方法區(qū)、程序寄存器等幾個核心部分。這一塊的內(nèi)容,以后會專門編寫文章進(jìn)行介紹,對于初學(xué)者來說,這還不適合我們學(xué)習(xí)。但是我們現(xiàn)在要先對以下三個概念有所了解:

棧: 棧中可以存儲基本類型的數(shù)據(jù)和引用類型的地址。特點: 先進(jìn)后出,一般空間比較小,存取速度較快。

堆: 堆中可以存儲引用類型的數(shù)據(jù)。特點: 空間比較大,存儲速度相對較慢。

方法區(qū): 方法區(qū)中可以 存儲字符串常量池、靜態(tài)數(shù)據(jù)、代碼和類的元數(shù)據(jù)。

我們知道,數(shù)組屬于引用類型,而數(shù)組的引用變量(數(shù)組名稱)只是一個地址引用。 這個引用變量可以指向任何有效的內(nèi)存空間,只有當(dāng)這個引用指向有效的空間時,才可以通過引用去操作數(shù)組中真正的數(shù)據(jù)元素。所以數(shù)組的引用變量(數(shù)組名稱)是存儲在棧空間中,但真正的數(shù)組數(shù)據(jù)是存儲在堆空間中。

2. 代碼案例

為了讓大家更好地理解數(shù)組的內(nèi)存結(jié)構(gòu),接下來給大家設(shè)計一個代碼案例,然后給大家分析一下這個數(shù)組的內(nèi)存結(jié)構(gòu)。

/**
 * @author
 */
public class Demo01 {
    public static void main(String[] args) {
	//使用靜態(tài)初始化的方式初始化一個數(shù)組a
        //a存放在棧中,a的值是數(shù)組的地址,數(shù)組的真正數(shù)據(jù){5,7,20}存放在堆中
        int[] a = {5,7,20}; 
        System.out.println("a的長度為:" + a.length);//3

        //整型變量,存放在棧中
        int num =8;
        System.out.println("num:"+num);

        //定義一個新的數(shù)組b
        int[] b=new int[4]; 
        System.out.println("b的長度是:"+b.length);

        //將a賦值給b,是b的指向改變了,但b原先對應(yīng)的數(shù)組依然存在
        b=a; 
        System.out.println("b的長度是:"+b.length);
    }
}

3. 內(nèi)存分析

為了讓各位更好地理解基本類型的數(shù)據(jù)和數(shù)組的內(nèi)存結(jié)構(gòu),給大家繪制下面一張圖。

根據(jù)上面的代碼和下面的內(nèi)存分析圖,我們可以得到如下結(jié)論:

  • 變量a存放在棧中,a的值是數(shù)組的首地址,數(shù)組的真正數(shù)據(jù){5,7,20}存放在堆中;
  • 整型變量num存放在棧中;
  • 定義新的數(shù)組b,數(shù)組名稱b存放在棧中,b的數(shù)據(jù)在堆中;
  • 將a賦值給b,此時b的指向改變了,但b原先對應(yīng)的數(shù)組依然存在,此時b指向原先a對應(yīng)的數(shù)組數(shù)據(jù)。

二. 數(shù)組擴容與縮容

1. 擴容簡介

在前面給大家說過,數(shù)組一旦創(chuàng)建初始化后,其長度就不能被改變。但是有的小伙伴就說了,”不對啊,我看別人的文章說,可以往數(shù)組中增加很多新數(shù)據(jù)啊......“。那如果是這樣,假如我們一開始定義一個長度為5的數(shù)組,然后想把10個數(shù)據(jù)元素都插進(jìn)去,這能不能實現(xiàn)?

大家想一下,你能把10升水裝到5升的瓶子中嗎?肯定不行!如果你非要把10升水都裝到瓶子里,肯定需要換一個新的更大的瓶子!

所以今天跟大家說的”數(shù)組擴容“,其實并不是將這些多余的數(shù)據(jù)裝到原有的數(shù)組中,而是創(chuàng)建一個新的更大的數(shù)組,再把原有數(shù)組中的內(nèi)容都復(fù)制到新數(shù)組中來!

2. 擴容與縮容流程(重點)

在Java中,數(shù)組的”擴容“和”縮容“,并不是真的改變原有數(shù)組的大小,而是創(chuàng)建一個新的數(shù)組,然后再進(jìn)行操作,具體流程如下:

  • 步驟1: 定義一個新數(shù)組,新數(shù)組的長度要比原數(shù)組增加或者減小;
  • 步驟2: 將原數(shù)組中的元素拷貝到新數(shù)組中;
  • 步驟3將原數(shù)組的名稱變量指向新數(shù)組。

3. 代碼實現(xiàn)

接下來就按照上面的流程,來帶大家實現(xiàn)一下數(shù)組的擴容和縮容。

3.1 擴容代碼

以下代碼是進(jìn)行數(shù)組擴容的案例。

/**
 * @author
 */
public class Demo05 {
    public static void main(String[] args) {
	// 數(shù)組擴容
	// 原數(shù)組
	int[] oldArr = { 1, 3, 46, 22, 11 };

	// 1.定義一個新數(shù)組,長度比原數(shù)組的長度多1,用于擴容
	int[] newArr = new int[oldArr.length + 1];

	// 2.數(shù)組拷貝
	for (int i = 0; i < oldArr.length; i++) {
            //數(shù)組拷貝,將原來數(shù)組的元素拷貝到新數(shù)組中
            newArr[i] = oldArr[i];
	}

	// 3.將原數(shù)組的名稱變量指向新數(shù)組
	oldArr = newArr;
	System.out.println("數(shù)組長度="+oldArr.length);
        
	//4.遍歷數(shù)組
	for (int i = 0; i < oldArr.length; i++) {
            //最后一個元素的值是默認(rèn)值0
            System.out.println(oldArr[i]);
	}
    }
}

這里我們使用newArr[i] = oldArr[i];這樣的語句,將舊數(shù)組中的元素拷貝到新數(shù)組中

3.2 縮容代碼

以下代碼是進(jìn)行數(shù)組縮容的案例,供大家參考:

/**
 * @author
 */
public class Demo06 {
    public static void main(String[] args) {
	// 數(shù)組縮容
	//定義一個原數(shù)組
	int[] oldArr = {1,3,46,22,11};
	//1.定義一個新數(shù)組,新數(shù)組的長度比原數(shù)組長度少1個
	int[] newArr = new int[oldArr.length-1];

	//2.進(jìn)行數(shù)組拷貝,將舊數(shù)組中的元素拷貝到新數(shù)組中
	for (int i = 0; i < newArr.length; i++) {
            newArr[i] = oldArr[i];
	}

	//3.將原數(shù)組的名稱變量指向新數(shù)組
	oldArr = newArr;
	for (int i = 0; i < newArr.length; i++) {
            System.out.println(oldArr[i]);
	}
    }
}

三. 數(shù)組拷貝

在給大家講解數(shù)組擴容時,涉及到了數(shù)組中數(shù)據(jù)元素的拷貝復(fù)制。那么除了上面的拷貝方式之外,數(shù)組還有哪些拷貝方式呢?

1. 拷貝方式

在Java中,數(shù)組的拷貝主要有三種實現(xiàn)方式:

通過循環(huán)語句,將原數(shù)組中的各個元素拷貝到新數(shù)組中(即數(shù)組擴容案例中使用的方法);

System類提供的數(shù)組拷貝方法;

Arrays類提供的數(shù)組拷貝方法。

接下來就設(shè)計幾個案例,來給大家展示這幾種方式都是怎么進(jìn)行數(shù)組拷貝的。因為第一種數(shù)組拷貝方式,我們已經(jīng)在數(shù)組擴容的案例中給大家演示了,這里就不再重復(fù)展示相關(guān)代碼了。

2. System.arraycopy方法

2.1 簡介

System.arraycopy()是Java提供的一個本地靜態(tài)方法,用于將數(shù)據(jù)元素從源數(shù)組復(fù)制到目標(biāo)數(shù)組。

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

arraycopy()方法有5個核心參數(shù),其含義如下:

  • src: 源數(shù)組,即被復(fù)制的舊數(shù)組;
  • srcPos: 源數(shù)組中開始復(fù)制的索引位置;
  • dest: 目標(biāo)數(shù)組,即要復(fù)制到的新數(shù)組;
  • destPos: 要復(fù)制到目標(biāo)數(shù)組中的索引位置;
  • length: 要復(fù)制的元素個數(shù)。

另外我們還要注意,arraycopy()方法在有些情況下有可能會發(fā)生如下異常:

  • NullPointerException: if source or destination array is null.NullPointerException :如果源或目標(biāo)數(shù)組為null時,就會產(chǎn)生NullPointerException異常。
  • ArrayStoreException: if the source and destination array type doesn’t match or they are not array.ArrayStoreException :如果源和目標(biāo)數(shù)組類型不匹配或不是數(shù)組,會產(chǎn)生該異常;
  • ArrayIndexOutOfBoundsException: if the data overflow occurs because of index values or they are negative.ArrayIndexOutOfBoundsException :如果由于索引值導(dǎo)致數(shù)據(jù)溢出,或它們?yōu)樨?fù)數(shù)時會產(chǎn)生該異常。

2.2 案例

我們先來看看下面這個數(shù)組拷貝的案例:

/**
 * @author
 */
public class Demo07 {
    public static void main(String[] args) {
	// 數(shù)組拷貝
	//1.源數(shù)組
	int[] srcArr = {1,3,46,22,11};

	//2.目標(biāo)數(shù)組
	int[] destArr = new int[srcArr.length + 5];
        /**
	* src:原數(shù)組
	* srcPos:原數(shù)組的起始拷貝位置
	* dest:目標(biāo)數(shù)組
	* destPos:目標(biāo)數(shù)組的起始拷貝位置
	* length:拷貝的長度
	*/
	//3.調(diào)用arraycopy方法進(jìn)行復(fù)制
	System.arraycopy(srcArr, 1, destArr, 3, 4);

	//對新數(shù)組進(jìn)行遍歷
	for (int i = 0; i < destArr.length; i++) {
            System.out.print(destArr[i]+"\t");
	}
    }
}

3. Arrays.copyOf方法

3.1 簡介

Arrays.copyOf()可以復(fù)制數(shù)組中指定范圍的元素。該方法會返回一個新的數(shù)組對象,且改變新數(shù)組中的元素值,不會影響原來的數(shù)組。我們還可以利用Arrays.toString方法將賦值后的數(shù)組輸出。

該方法支持的參數(shù)可以是long、float、double、int、boolean、byte、Object等類型的數(shù)組。

public static int[] copyOf(int[] original, int newLength);

copyOf()方法有2個核心參數(shù),其含義如下:

  • original: 源數(shù)組,即被復(fù)制的舊數(shù)組;
  • newLength: 表示新數(shù)組的長度。如果新數(shù)組的長度超過源數(shù)組的長度,會采用數(shù)組元素類型的默認(rèn)值。

3.2 案例

以下是Arrays.copyOf()方法的實現(xiàn)案例:

/**
 * @author
 */
public class Demo08 {
    public static void main(String[] args) {
	// 數(shù)組拷貝
	//1.源數(shù)組
	int[] srcArr = {1,3,46,22,11};
	/**
	* original:原數(shù)組
	* newLength:新數(shù)組的長度
	* 返回值:返回新數(shù)組 
	*/
	//2.調(diào)用copyOf方法進(jìn)行數(shù)組拷貝
	int[] destArr = Arrays.copyOf(srcArr, srcArr.length+1);
		
	//3.遍歷新數(shù)組
	for (int i = 0; i < srcArr.length; i++) {
            System.out.print(destArr[i]+"\t");
	}
    }
}

四. 結(jié)語

至此,就把數(shù)組的擴容、縮容及拷貝等內(nèi)容給大家介紹完畢了,現(xiàn)在你明白數(shù)組的擴容原理了嗎?

以上就是詳解Java數(shù)組擴容縮容與拷貝的實現(xiàn)和原理的詳細(xì)內(nèi)容,更多關(guān)于Java數(shù)組擴容縮容與拷貝的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Intellij?IDEA如何查看所有斷點

    Intellij?IDEA如何查看所有斷點

    這篇文章主要介紹了Intellij?IDEA如何查看所有斷點問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • JavaWeb實現(xiàn)同一帳號同一時間只能一個地點登陸(類似QQ登錄的功能)

    JavaWeb實現(xiàn)同一帳號同一時間只能一個地點登陸(類似QQ登錄的功能)

    最近做了企業(yè)項目,其中有這樣的需求要求同一帳號同一時間只能一個地點登陸類似QQ登錄的功能。下面小編通過本文給大家分享實現(xiàn)思路,感興趣的朋友參考下吧
    2016-11-11
  • java加密算法--MD5加密和哈希散列帶秘鑰加密算法源碼

    java加密算法--MD5加密和哈希散列帶秘鑰加密算法源碼

    這篇文章主要介紹了java加密算法--MD5加密和哈希散列帶秘鑰加密算法源碼的相關(guān)資料,這里附實例代碼,幫助到大家學(xué)習(xí)理解,需要的朋友可以參考下
    2016-11-11
  • Java中SpringCloud的五大組件詳解

    Java中SpringCloud的五大組件詳解

    這篇文章主要介紹了Java中SpringCloud的五大組件詳解,Spring cloud是一個基于Spring Boot實現(xiàn)的服務(wù)治理工具包,在微服務(wù)架構(gòu)中用于管理和協(xié)調(diào)服務(wù),需要的朋友可以參考下
    2023-07-07
  • javax.persistence中@Column定義字段類型方式

    javax.persistence中@Column定義字段類型方式

    這篇文章主要介紹了javax.persistence中@Column定義字段類型方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java 四舍五入保留小數(shù)的實現(xiàn)方法

    java 四舍五入保留小數(shù)的實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨ava 四舍五入保留小數(shù)的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Java中的垃圾收集器詳解

    Java中的垃圾收集器詳解

    這篇文章主要介紹了Java中的垃圾收集器詳解,垃圾收集機制是?Java?的招牌能力,極大地提高了開發(fā)效率,如今垃圾收集幾乎成為現(xiàn)代語言的標(biāo)配,需要的朋友可以參考下
    2023-07-07
  • 源碼解讀Mybatis占位符#和$的區(qū)別

    源碼解讀Mybatis占位符#和$的區(qū)別

    這篇文章主要介紹了Mybatis占位符#和$的區(qū)別通過源碼解讀,針對筆者日常開發(fā)中對?Mybatis?占位符?#{}?和?${}?使用時機結(jié)合源碼,思考總結(jié)而來,需要的朋友可以參考下
    2023-02-02
  • java中四種生成和解析XML文檔的方法詳解(介紹+優(yōu)缺點比較+示例)

    java中四種生成和解析XML文檔的方法詳解(介紹+優(yōu)缺點比較+示例)

    本篇文章主要介紹了四種生成和解析XML文檔的方法,即:DOM、SAX、JDOM和DOM4J,具有一定的參考價值,有興趣的可以了解一下。
    2016-11-11
  • Spring運行時手動注入bean的方法實例

    Spring運行時手動注入bean的方法實例

    spring給我們提供了IOC服務(wù),讓我們可以用注解的方式,方便的使用bean的相互引用,下面這篇文章主要給大家介紹了關(guān)于Spring運行時手動注入bean的相關(guān)資料,需要的朋友可以參考下
    2022-05-05

最新評論