【Java】数组拷贝的四种方法
生活随笔
收集整理的這篇文章主要介紹了
【Java】数组拷贝的四种方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
四種方法
System.arraycopy()
這是一個native的方法,也是對大數組最高效的方法。
Arrays.copyOf()
源碼如下:
public static <T> T[] copyOf(T[] original, int newLength) {return copyOf(original, newLength, original.getClass()); }效率基本上一直都比System.arraycopy()差。
arrayObj.clone()
數組的clone()看不到,不過還是存在clone()的,效果還行吧。
for循環為數組逐一賦值
這個在小數據量級別既簡單又快速,數據量大以后就很慢了。
如何做效率測試
薦讀:獲取Java代碼段運行毫秒數的策略
為什么用String類型的"orzorzorzorz"呢?
因為太小的數組單元占用空間太少,復制太簡單;太大還容易爆空間,所以就用這個挺好。
為什么開10_000_000大小的數組呢?
首先聲明,10_000_000這個寫法,其實是為了防止位數太多,看不清楚而有的寫法,是符合Java語法規范的。
在一個是需要多次使用,使用一個final修飾的常量能更方便調整數組大小且保持統一。
10M,也就是1000W,應該算比較大的數組了。我們在不開大虛擬機空間的情況下,1000W已經很大了。開到100W不明顯;開到1億就內存爆炸了。
所以隨便開個1000W的數組吧!
clone()是深拷貝嗎
薦讀:總結Java數組的拷貝和輸出
對于一維數組,確實能做到深拷貝!
完整代碼
import java.util.Arrays;public class ArrayCopyTest {public static void main(String[] args) {final int LIMIT = 10_000_000;String[] array0 = new String[LIMIT];Arrays.fill(array0, "orzorzorzorz");String[] array = new String[LIMIT];long time1 = System.currentTimeMillis();System.arraycopy(array0, 0, array, 0, LIMIT);long time2 = System.currentTimeMillis();array = Arrays.copyOf(array0, LIMIT);long time3 = System.currentTimeMillis();array = array0.clone();long time4 = System.currentTimeMillis();for (int i = 0; i < LIMIT; i++) {array[i] = array0[i];}long time5 = System.currentTimeMillis();System.out.println("方法一耗時:" + (time2-time1));System.out.println("方法二耗時:" + (time3-time2));System.out.println("方法三耗時:" + (time4-time3));System.out.println("方法四耗時:" + (time5-time4));} }測試結果例舉
方法一耗時:15 方法二耗時:47 方法三耗時:48 方法四耗時:78其實這個結果不唯一啊,我有幾次測試竟然是方法三更快,這個還算比較正常的,嗯。
四種方法的效率總結
- 原始數組長度不管是多少的時候,Arrays.copyOf()的效率都比System.arraycopy()差,tcl。
- 原始數組長度比較小的時候,千以內的范圍中,for循環表現十分優異,并隨著數組長度的增加,效率越來越低,因此,for循環適合于小型數組,而且用著真簡單。
- 原始數組長度中等的時候,萬以內的范圍內,兩個native方法的效率差不多。
- 原始數組長度比較大的時候,幾萬、幾十萬+乃至更多,這時候native方法System.arraycopy()的優勢體現出來了,效率拔群。
- 較大數據量的時候四種方法按照效率降序排列:
- No.1: System.arraycopy()
- No.2: Arrays.copyOf()
- No.3: arrayObj.clone()
- No.4: for循環為數組逐一賦值
總結
以上是生活随笔為你收集整理的【Java】数组拷贝的四种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构与算法】红黑树的Java实现
- 下一篇: 【操作系统】Semaphore处理哲学家