Java Arrays.copyOf方法為何要特殊處理Object數組?

Java Arrays.copyOf方法為何要特殊處理Object數組?

Java Arrays.copyOf 方法中 Object 數組的特殊處理詳解

Java 的 Arrays.copyOf 方法用于創建數組副本。其源碼中對 Object 數組的處理方式與其他類型數組不同,這并非巧合,而是出于性能優化的考慮。讓我們深入分析其原因。

以下為 Arrays.copyOf 方法的源碼片段:

public static <T> T[] copyOf(T[] original, int newLength, class<? extends T[]> newType) {     @SuppressWarnings("unchecked")     T[] copy = ((Object) newType == (Object) Object[].class)             ? (T[]) new Object[newLength]             : (T[]) Array.newInstance(newType.getComponentType(), newLength);     System.arraycopy(original, 0, copy, 0,             Math.min(original.length, newLength));     return copy; }

代碼的關鍵在于三元運算符

立即學習Java免費學習筆記(深入)”;

  • ((Object) newType == (Object) Object[].class): 這段代碼判斷 newType 是否為 Object[] 類。

  • (T[]) new Object[newLength]: 如果 newType 是 Object[],則直接使用 new Object[newLength] 創建新的 Object 數組。

  • (T[]) Array.newInstance(newType.getComponentType(), newLength): 否則,使用 Array.newInstance 方法創建數組。

為什么不直接使用 Array.newInstance 創建所有類型的數組呢?

Array.newInstance 是一個本地方法,它依賴于反射機制創建數組,這會帶來一定的性能開銷。而對于 Object 數組,new Object[newLength] 是一種更直接、更高效的創建方式,避免了反射的開銷。 這種優化策略在復制 Object 數組時尤為重要,因為它能顯著提升效率。 直接使用 new Object[newLength] 的速度明顯快于調用 Array.newInstance,后者需要經過本地方法調用和反射機制,這會產生額外的性能損耗。

因此,當可以確定 newType 為 Object[].class 時,選擇直接創建 Object 數組是提高 Arrays.copyOf 方法性能的有效手段。

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享