Java通過底層原碼了解數(shù)組拷貝
循環(huán)對數(shù)組進行拷貝
利用循環(huán)對數(shù)組進行拷貝很簡單,就是利用循環(huán)將要拷貝的數(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];
}
}
這是我們一般會想到的方法,下面將一些JAVA為我們提供的一些比較方便的方法。
Arrays.copyOf方法
因為我是拷貝的整型數(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方法的返回值是是一個整型數(shù)組,而形參是有兩個參數(shù),一個是整型數(shù)組,另外一個是一個整型的變量。
形參中整型數(shù)組就是我們要拷貝數(shù)組的數(shù)組名
形參中的整型變量就是我們要拷貝數(shù)組的長度
因為是有返回值的,所以我們在使用Arrays.copyOf方法的時候,要有數(shù)組來接收返回值。代碼實現(xiàn)如下:
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
int[] copy =Arrays.copyOf(arr,arr.length);
}
注意:拷貝的長度是可以超過要拷貝數(shù)組的長度的,如果超過了拷貝數(shù)組的長度的話,那么多出來的元素值就為0;比如:我要拷貝arr數(shù)組,但是arr數(shù)組的大小為5,如果我在拷貝的時候,將arr.length*2了,那么copy這個數(shù)組大小就是變成10,并且6~10個元素值為0.這也算是擴容。
Arrays.copyofRange方法
如果我們要拷貝部分數(shù)組的一部分,就可以使用Arrays.copyRange這個方法。同上一樣,也是用拷貝整型數(shù)組進行講解,我們先看一下它底層的原碼:
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的原碼可以看到返回值是一個整型的數(shù)組,而形參是一個整型數(shù)組,兩個整型的變量。
形參中的整型數(shù)組就是要拷貝的數(shù)組的數(shù)組名
形參中的兩個整型變量from和to就是你要拷貝數(shù)組元素的范圍,注意這個范圍是[form,to)是左閉右開的,不包括to那個位置的元素。代碼實現(xiàn)如下:
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
int[] copy = Arrays.copyOfRange(arr,1,3);
}
注意:數(shù)組下標是從0開始的,1~3號的元素是指2,3,4.但是右邊是開區(qū)間,所以不包括4,因此copy這個數(shù)組知識拷貝了2和3這兩個元素。
System.arraycopy方法
然后我們來講一下System.arraycopy方法,其實細心的同學已經(jīng)發(fā)現(xiàn)了,在前面兩個方法的原碼中都有System.arraycopy方法,他們的底層也是靠System.arraycopy方法來實現(xiàn)的。我們來先看一下它底層的原碼
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);

System.arraycopy是看不到實現(xiàn)的原碼的,原因在于native,它的底層是C/C++來實現(xiàn)的。但是native方法的優(yōu)點就是執(zhí)行速度非???。代碼實現(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);
}
此時拷貝的是arr整個數(shù)組,如果想要部分拷貝,可以通過改變形參來完成部分拷貝
clone方法
最后一個是數(shù)組名.clone這個方法,這個方法了解即可,代碼實現(xiàn)如下:
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
int[] copy = arr.clone();
}
這樣就拷貝完了,這種方法主要是產(chǎn)生了對象的一個副本,地址還是不一樣的。
總結
今天主要講解了數(shù)組拷貝的幾種方法,雖然可能不會經(jīng)常用到,但是我們還是掌握一下比較好。說不定那天就用到了,將來的你一定會感謝現(xiàn)在努力學習的自己。
到此這篇關于Java通過底層原碼了解數(shù)組拷貝的文章就介紹到這了,更多相關Java數(shù)組拷貝內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring多數(shù)據(jù)源配置實現(xiàn)方法實例分析
這篇文章主要介紹了spring多數(shù)據(jù)源配置實現(xiàn)方法,結合實例形式分析了spring多數(shù)據(jù)源配置相關操作技巧與使用注意事項,需要的朋友可以參考下2019-12-12
Apache Dubbo的SPI機制是如何實現(xiàn)的
SPI全稱為Service Provider Interface,對應中文為服務發(fā)現(xiàn)機制。SPI類似一種可插拔機制,首先需要定義一個接口或一個約定,然后不同的場景可以對其進行實現(xiàn),調用方在使用的時候無需過多關注具體的實現(xiàn)細節(jié)。在Java中,SPI體現(xiàn)了面向接口編程的思想,滿足開閉設計原則。2021-06-06

