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

Java通過底層原碼了解數(shù)組拷貝

 更新時(shí)間:2022年07月14日 09:55:00   作者:白朝槿kk  
一般說起數(shù)組的拷貝,首先想到的就是用循環(huán)對(duì)數(shù)組進(jìn)行拷貝。但其實(shí)JAVA為我們提供了一些拷貝數(shù)組比較方便的方法,有完全拷貝的方法,也有部分拷貝的方法。接下來就一一介紹這些方法

循環(huán)對(duì)數(shù)組進(jìn)行拷貝

利用循環(huán)對(duì)數(shù)組進(jìn)行拷貝很簡(jiǎn)單,就是利用循環(huán)將要拷貝的數(shù)組的元素逐個(gè)賦值給新的數(shù)組。具體代碼實(shí)現(xiàn)如下:

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            copy[i] = arr[i];
        }
    }

這是我們一般會(huì)想到的方法,下面將一些JAVA為我們提供的一些比較方便的方法。

Arrays.copyOf方法

因?yàn)槲沂强截惖恼蛿?shù)組,所以我用的就是拷貝整型數(shù)組的Arrays.copyOf方法。也可以拷貝其它類型的數(shù)組,并不是只能拷貝整型數(shù)組。

下面就以拷貝整型數(shù)組來講解Arrays.copyOf方法,我們先來看一下Arrays.copyOf方法底層的原碼:

public static int[] copyOf(int[] original, int newLength) {
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

我們可以看到Array.copyOf方法的返回值是是一個(gè)整型數(shù)組,而形參是有兩個(gè)參數(shù),一個(gè)是整型數(shù)組,另外一個(gè)是一個(gè)整型的變量。

形參中整型數(shù)組就是我們要拷貝數(shù)組的數(shù)組名

形參中的整型變量就是我們要拷貝數(shù)組的長(zhǎng)度

因?yàn)槭怯蟹祷刂档?,所以我們?cè)谑褂肁rrays.copyOf方法的時(shí)候,要有數(shù)組來接收返回值。代碼實(shí)現(xiàn)如下:

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy =Arrays.copyOf(arr,arr.length);
    }

注意:拷貝的長(zhǎng)度是可以超過要拷貝數(shù)組的長(zhǎng)度的,如果超過了拷貝數(shù)組的長(zhǎng)度的話,那么多出來的元素值就為0;比如:我要拷貝arr數(shù)組,但是arr數(shù)組的大小為5,如果我在拷貝的時(shí)候,將arr.length*2了,那么copy這個(gè)數(shù)組大小就是變成10,并且6~10個(gè)元素值為0.這也算是擴(kuò)容。

Arrays.copyofRange方法

如果我們要拷貝部分?jǐn)?shù)組的一部分,就可以使用Arrays.copyRange這個(gè)方法。同上一樣,也是用拷貝整型數(shù)組進(jìn)行講解,我們先看一下它底層的原碼:

public static int[] copyOfRange(int[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        int[] copy = new int[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }

我們通過Arrays.copyRange的原碼可以看到返回值是一個(gè)整型的數(shù)組,而形參是一個(gè)整型數(shù)組,兩個(gè)整型的變量。

形參中的整型數(shù)組就是要拷貝的數(shù)組的數(shù)組名

形參中的兩個(gè)整型變量from和to就是你要拷貝數(shù)組元素的范圍,注意這個(gè)范圍是[form,to)是左閉右開的,不包括to那個(gè)位置的元素。代碼實(shí)現(xiàn)如下:

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = Arrays.copyOfRange(arr,1,3);
    }

注意:數(shù)組下標(biāo)是從0開始的,1~3號(hào)的元素是指2,3,4.但是右邊是開區(qū)間,所以不包括4,因此copy這個(gè)數(shù)組知識(shí)拷貝了2和3這兩個(gè)元素。

System.arraycopy方法

然后我們來講一下System.arraycopy方法,其實(shí)細(xì)心的同學(xué)已經(jīng)發(fā)現(xiàn)了,在前面兩個(gè)方法的原碼中都有System.arraycopy方法,他們的底層也是靠System.arraycopy方法來實(shí)現(xiàn)的。我們來先看一下它底層的原碼

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

System.arraycopy是看不到實(shí)現(xiàn)的原碼的,原因在于native,它的底層是C/C++來實(shí)現(xiàn)的。但是native方法的優(yōu)點(diǎn)就是執(zhí)行速度非???。代碼實(shí)現(xiàn)如下:

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = new int[arr.length];
        System.arraycopy(arr,0,copy,0,arr.length);
    }

此時(shí)拷貝的是arr整個(gè)數(shù)組,如果想要部分拷貝,可以通過改變形參來完成部分拷貝

clone方法

最后一個(gè)是數(shù)組名.clone這個(gè)方法,這個(gè)方法了解即可,代碼實(shí)現(xiàn)如下:

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = arr.clone();
    }

這樣就拷貝完了,這種方法主要是產(chǎn)生了對(duì)象的一個(gè)副本,地址還是不一樣的。

總結(jié)

今天主要講解了數(shù)組拷貝的幾種方法,雖然可能不會(huì)經(jīng)常用到,但是我們還是掌握一下比較好。說不定那天就用到了,將來的你一定會(huì)感謝現(xiàn)在努力學(xué)習(xí)的自己。

到此這篇關(guān)于Java通過底層原碼了解數(shù)組拷貝的文章就介紹到這了,更多相關(guān)Java數(shù)組拷貝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Mock進(jìn)行業(yè)務(wù)邏輯層Service測(cè)試詳解

    使用Mock進(jìn)行業(yè)務(wù)邏輯層Service測(cè)試詳解

    這篇文章主要介紹了使用Mock進(jìn)行業(yè)務(wù)邏輯層Service測(cè)試詳解,mock是一種模擬對(duì)象的技術(shù),用于在測(cè)試過程中替代真實(shí)的對(duì)象,通過mock,我們可以控制被模擬對(duì)象的行為和返回值,以便進(jìn)行更加精確的測(cè)試,需要的朋友可以參考下
    2023-08-08
  • spring多數(shù)據(jù)源配置實(shí)現(xiàn)方法實(shí)例分析

    spring多數(shù)據(jù)源配置實(shí)現(xiàn)方法實(shí)例分析

    這篇文章主要介紹了spring多數(shù)據(jù)源配置實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了spring多數(shù)據(jù)源配置相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • ssm實(shí)現(xiàn)分頁查詢的實(shí)例

    ssm實(shí)現(xiàn)分頁查詢的實(shí)例

    下面小編就為大家?guī)硪黄猻sm實(shí)現(xiàn)分頁查詢的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java easyexcel導(dǎo)出報(bào)內(nèi)存溢出的問題解決

    Java easyexcel導(dǎo)出報(bào)內(nèi)存溢出的問題解決

    在Java開發(fā)時(shí),使用EasyExcel處理大數(shù)據(jù)量導(dǎo)出可能遇到內(nèi)存溢出問題,本文深入分析了內(nèi)存溢出的原因,并提出了優(yōu)化策略,感興趣的可以了解一下
    2024-10-10
  • idea如何關(guān)閉頁面顯示的瀏覽器圖標(biāo)

    idea如何關(guān)閉頁面顯示的瀏覽器圖標(biāo)

    這篇文章主要介紹了idea如何關(guān)閉頁面顯示的瀏覽器圖標(biāo)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 如何在Java中實(shí)現(xiàn)一個(gè)散列表

    如何在Java中實(shí)現(xiàn)一個(gè)散列表

    這篇文章主要介紹了如何在Java中實(shí)現(xiàn)一個(gè)散列表,建一個(gè)HashMap,以String類型為Key,Int類型為Value,下文具體的操作過程需要的小伙伴可以參考一下
    2022-04-04
  • java-spark中各種常用算子的寫法示例

    java-spark中各種常用算子的寫法示例

    這篇文章主要給大家介紹了關(guān)于java-spark中各種常用算子的寫法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • java基本教程之線程讓步 java多線程教程

    java基本教程之線程讓步 java多線程教程

    本文對(duì)Thread中的線程讓步方法yield()進(jìn)行介紹,yield()的作用是讓步。它能讓當(dāng)前線程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”,從而讓其它具有相同優(yōu)先級(jí)的等待線程獲取執(zhí)行權(quán),大家參考使用吧
    2014-01-01
  • java中mybatis和hibernate的用法總結(jié)

    java中mybatis和hibernate的用法總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于java中mybatis和hibernate的用法總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-01-01
  • Apache Dubbo的SPI機(jī)制是如何實(shí)現(xiàn)的

    Apache Dubbo的SPI機(jī)制是如何實(shí)現(xiàn)的

    SPI全稱為Service Provider Interface,對(duì)應(yīng)中文為服務(wù)發(fā)現(xiàn)機(jī)制。SPI類似一種可插拔機(jī)制,首先需要定義一個(gè)接口或一個(gè)約定,然后不同的場(chǎng)景可以對(duì)其進(jìn)行實(shí)現(xiàn),調(diào)用方在使用的時(shí)候無需過多關(guān)注具體的實(shí)現(xiàn)細(xì)節(jié)。在Java中,SPI體現(xiàn)了面向接口編程的思想,滿足開閉設(shè)計(jì)原則。
    2021-06-06

最新評(píng)論

阜平县| 龙泉市| 桂阳县| 改则县| 将乐县| 孟村| 建湖县| 镇远县| 南陵县| 嘉定区| 盐城市| 固始县| 游戏| 金寨县| 蓬安县| 德州市| 阳高县| 大城县| 固镇县| 揭阳市| 公主岭市| 那坡县| 铜川市| 五大连池市| 如东县| 青海省| 霍林郭勒市| 广安市| 鸡西市| 出国| 吉水县| 科尔| 马山县| 奇台县| 兰溪市| 抚顺市| 台山市| 连城县| 会宁县| 佳木斯市| 苍山县|