4

Long[]有没有人知道在带有(un)box&copy的明显for循环之外的Java中转换为long[]反之亦然的有效,快速和干净的方法?

注意:这与拆箱或装箱无关。我明确地谈论数组!Longlong

“没有比循环和复制更好的方法”也是一个答案;)

编辑: 我知道执行上述操作的含义,最好避免这样做。假设,我无法避免它,并且希望在不使用 3rd 方的东西的情况下尽可能聪明地做到这一点。

4

7 回答 7

9

如果您使用apache commons lang,您可以执行以下操作:

long[] primitive = ArrayUtils.toPrimitive(new Long[]{1L, 2L, 3L, 4L});
于 2012-12-13T12:33:36.093 回答
8

没有比循环和复制更好的方法了

最好的解决方案是首先避免转换。如果您担心效率,请避免使用Long[],因为它比long[]如果您需要使用集合大很多倍,您可以尝试包装 long[] 的 TLongArrayList。

于 2012-12-13T12:33:57.907 回答
4

当 Java 装箱/拆箱时,它实际上做了一些事情,即使它没有向用户显示它。

Long[]并且long[]是非常不同的对象。所以答案是,不,你必须循环和复制。但更好的问题是,你为什么需要这个?您几乎可以在任何情况下交替使用它们……您必须在实现时决定对您来说更重要的是对象创建还是内存使用。希望您使用Long.valueOf创建Longs(或自动装箱)来使用 Java 的Long值缓存。

这是apache common lang的来源ArrayUtils.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;
}
于 2012-12-13T12:33:03.940 回答
1

Java 本身不提供将对象数组转换为预置数组的任何方法。

于 2012-12-13T12:33:19.307 回答
1

ArrayUtil 参考希望这可能会有所帮助。

long[] longs = new long[]{1L};
Long[] longObjects = ArrayUtils.toObject(longs);
List<Long> longList = java.util.Arrays.asList(longObjects);
于 2012-12-13T12:33:27.530 回答
1

没有比循环和复制更好的方法了,包裹在一个可以反复使用的辅助函数中

于 2012-12-13T12:33:31.650 回答
0

您可以使用 Apache 中的 ArrayUtils 来执行此操作,如下所述:

将原始 long 数组转换为 Long 列表

于 2012-12-13T12:33:48.153 回答