2012-12-13 124 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 - 一个循环是不可避免的。 –