2012-12-13 127 views
3

有誰知道一個高效,快捷,乾淨的方式Long[]轉換爲long[],反之亦然Java中的明顯的環帶(UN)箱&副本外面?長[]要長[],反之亦然?

注意:這是不是關於拆箱Long或拳擊long。我明確地談論數組!

「沒有比迴路更好的辦法,並複製」也將是一個答案;)

編輯: 我知道做上述的含義,它是更好地避免它。假設,我無法避免它,並希望儘可能聰明地做到這一點,而不使用第三方的東西。

+0

我會去循環和複製真的。 – OmniOwl

+3

「沒有比循環和複製更好的方法了:)」 - Java對於它的數組類型非常嚴格。 'Cast-style'轉換不起作用,自動拆箱不適用於數組(但?)。 – JimmyB

+0

爲什麼你需要那個? – dantuch

回答

6

沒有比循環更好的方式和複製

最好的解決方案是避免首先轉換。如果您擔心效率,請避免使用Long[],因爲它比long[]大很多倍如果您需要使用集合,則可以嘗試包裝long []的TLongArrayList。

+3

+1 - 尋求最佳解決方案。 –

+0

@StephenC乾杯。 :) –

+0

首先提出問題的先決條件是,由於我的管轄範圍之外的原因,我無法避免轉換。我只是想,如果我無法避免它,我至少希望儘可能聰明地做到這一點。 – Fildor

4

當的Java盒/ unboxes,它實際上做一些事情,即使它沒有展示給用戶。

Long[]long[]是非常不同的對象。所以答案是,不,你必須循環和複製。但更好的問題是,你爲什麼需要這個?幾乎在任何情況下都可以互換使用它們......您必須在實施中決定對您來說什麼更重要,對象創建或內存使用情況。希望你用Long.valueOf創建您Long S(或自動裝箱)使用Java的緩存Long值。

這是apache common langArrayUtils.toPrimitive的來源。它使用一個循環。

public static long[] toPrimitive(Long[] array) { 
    if (array == null) { 
    return null; 
    } else if (array.length == 0) { 
    return EMPTY_LONG_ARRAY; 
    } 
    final long[] result = new long[array.length]; 
    for (int i = 0; i < array.length; i++) { 
    result[i] = array[i].longValue(); 
    } 
    return result; 
} 
1

Java本身並沒有提供任何方式來將對象數組轉換爲元組數組。

1

ArrayUtil Reference希望這有助於。

long[] longs = new long[]{1L}; 
Long[] longObjects = ArrayUtils.toObject(longs); 
List<Long> longList = java.util.Arrays.asList(longObjects); 
1

沒有比環路及複印件,包裹在一個輔助功能,更好的方法,你可以用一遍又一遍

6

如果使用apache commons lang你可以這樣做:

long[] primitive = ArrayUtils.toPrimitive(new Long[]{1L, 2L, 3L, 4L}); 
+0

整潔的答案,但我傾向於不使用第三方庫。 – Fildor

+0

這不是一個好的答案,它沒有解釋並使用循環。 – durron597

+0

@ durron597 - 一個循環是不可避免的。 –