2010-07-25 126 views

回答

69

您可以嘗試System.arraycopy或使用Arrays類中的數組函數,如java.util.Arrays.copyOf。兩者都應該爲您提供本機性能。

Arrays.copyOf可能有利於可讀性,但僅在java 1.6中引入。

byte[] src = {1, 2, 3, 4}; 
byte[] dst = Arrays.copyOf(src, src.length); 
System.out.println(Arrays.toString(dst)); 
+0

我認爲第二個選擇更「合乎邏輯」。我從來不明白爲什麼System.arraycopy()是最可能的位置之一。 – sinuhepop 2010-07-25 13:29:01

+0

@Sinuhe - 這是歷史原因。 – 2010-07-25 13:46:58

+12

這不是正確的答案。 memcpy()不分配數據,只複製到現有的緩衝區。而Arrays.copyOf()明確地分配新的內存。 – splinux 2016-02-17 17:10:01

5

您可以使用System.arrayCopy。它將元素從源數組複製到目標數組。 Sun的實現使用手動優化的彙編程序,因此速度很快。

78

使用System.arraycopy()

System.arraycopy(sourceArray, 
       sourceStartIndex, 
       targetArray, 
       targetStartIndex, 
       length); 

實施例,

String[] source = { "alpha", "beta", "gamma" }; 
String[] target = new String[source.length]; 
System.arraycopy(source, 0, target, 0, source.length); 


或使用Arrays.copyOf()
實施例,

target = Arrays.copyOf(source, length); 

在JDK 1.6中添加了。

copyOf()方法使用System.arrayCopy()複製數組,但比clone()更靈活,因爲您可以複製數組的各個部分。

+0

+1的例子。 – 2010-07-25 12:41:15

+0

Arrays.copyOf()也分配內存。在你的例子中,如果你改變了String [] target = new String [4];然後target = Arrays.copyOf()它創建一個新的目標,它是一個String [3]。不是memcopy行爲。 – MikeF 2016-06-14 13:11:44

7

如果您只想要一維數組的精確副本,請使用clone()

byte[] array = { 0x0A, 0x01 }; 
byte[] copy = array.clone(); 

對於其它陣列的複製操作,使用System.arrayCopy/Arrays.copyOf作爲Tom suggests

一般而言,clone應該避免,但這是規則的例外。

+0

另請參閱http://stackoverflow.com/questions/3208899/how-do-i-clone-a-java-byte-array的接受答案中的更多詳細信息。 – 2015-01-08 17:04:52

2

Java實際上的確有些東西就像memcpy()。不安全類有一個與memcpy()基本相同的copyMemory()方法。當然,就像memcpy()一樣,它不提供內存覆蓋,數據銷燬等保護。不清楚它是真的是memcpy()還是memmove()。它可用於從實際地址複製到實際地址或從參考文獻引用。請注意,如果使用引用,則必須提供偏移量(否則JVM將盡快死亡)。 ()我的老累PC上每秒鐘高達2 GB)。使用風險自負。請注意,所有JVM實現都不存在不安全類。

+0

對於這個古老的線程去所有寵物sematary抱歉,但你能給我一個例子如何做一個參考數組。對於少量數據(比如1到4 MB)它更快嗎?或者對於像你提到的2GB那樣的更大數據來說,它是值得的? – FinnTheHuman 2016-06-29 16:16:42

+0

使用'sun.misc.Unsafe'類被認爲是一個糟糕的做法「黑客」B/C它是一個*私人*包類。另外,從Java 9開始,它將不再可用,因此嘗試使用此類與請求代碼意外中斷相同。 – ray 2017-05-30 07:45:45

相關問題