如果必須使用原始陣列的工作,而不是ArrayList
然後Arrays
有你需要的東西。如果您查看源代碼,這些是獲取數組副本的絕對最佳方式。它們確實有很好的防禦性編程,因爲System.arraycopy()
方法會在輸入不合邏輯的參數時拋出大量未經檢查的異常。
您可以使用Arrays.copyOf()
,它將從第一個複製到Nth
元素到新的較短陣列。
public static <T> T[] copyOf(T[] original, int newLength)
複製指定的數組,截取或用null填充(如果必要 )以使副本具有指定的長度。對於 在原始數組和複製中均有效的所有索引,這兩個數組將包含相同的值。對於副本 中有效但不是原始副本的索引,副本將包含空值。當且僅當指定長度大於 原始數組的長度時,這些索引將存在 。結果數組與原始數組的 完全相同。
2770
2771 public static <T,U> T[] More ...copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
2772 T[] copy = ((Object)newType == (Object)Object[].class)
2773 ? (T[]) new Object[newLength]
2774 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
2775 System.arraycopy(original, 0, copy, 0,
2776 Math.min(original.length, newLength));
2777 return copy;
2778 }
Arrays.copyOfRange()
或也將達到目的:
public static <T> T[] copyOfRange(T[] original, int from, int to)
複製指定的數組到一個新的數組的指定範圍內。 範圍的起始索引(from)必須位於零和 original.length之間,包括在內。原始[來自]的值被放入副本的初始元素 (除非== === original.length或從== ==到 )。原始數組中隨後元素的值是 ,放置在副本中的後續元素中。 範圍(to)的最終索引必須大於或等於from,可能是 大於original.length,在這種情況下null將放置在索引大於或等於該索引的副本的所有 元素中到 original.length - from。返回數組的長度將從 - 。得到的數組與原始的 數組完全相同。
3035 public static <T,U> T[] More ...copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
3036 int newLength = to - from;
3037 if (newLength < 0)
3038 throw new IllegalArgumentException(from + " > " + to);
3039 T[] copy = ((Object)newType == (Object)Object[].class)
3040 ? (T[]) new Object[newLength]
3041 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
3042 System.arraycopy(original, from, copy, 0,
3043 Math.min(original.length - from, newLength));
3044 return copy;
3045 }
正如你所看到的,這些都只是包裝函數在System.arraycopy
防禦性的邏輯是你正在嘗試做的是有效的。
System.arraycopy
是複製數組的絕對最快的方法。
你不能在O(1)時間內做到這一點。 Java中數組的長度不能改變,所以你需要創建一個新的。 Jarrod的答案提供瞭如何正確執行此操作的詳細信息。 –
@Math謝謝,只是想知道它是否可行更快。 –