将Long[]转换为long[],反之亦然?

5

有人知道在Java中将Long[]转换为long[]以及相反的高效、快速、干净的方法吗?除了使用(反)装箱循环,有没有更好的方法?

注意:这不是关于拆箱Long或装箱long。我明确在谈论数组!

"没有比循环和复制更好的方法"也可以成为一个答案;)

编辑: 我意识到上面做法的影响,并且最好是避免它。但请假设我无法避免它,并且希望尽可能智能地执行它,而不使用第三方工具。


我会选择使用循环和复制。 - OmniOwl
4
"没有比循环和复制更好的方法" :) - Java 在其数组类型方面相当严格。 "强制转换" 不起作用,自动拆箱在数组中也不起作用(暂时?)。 - JimmyB
1
一个 Long 对象数组和一个 long 原始类型数组是完全不同的。没有比循环和拆箱更有效的转换方法。 - Jesper
8个回答

10

如果你使用apache commons lang,你可以这样做:

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

不错的答案,但我倾向于不使用第三方库。 - Fildor
这不是一个好的答案,它没有解释并且使用了循环。 - durron597
1
@durron597 - 循环是不可避免的。 - Stephen C
@StephenC 我知道循环是不可避免的,但由于缺乏解释,这会误导读者。 - durron597

8

循环和复制是最好的方法

最好的解决方案是在一开始就避免转换。如果您担心效率,请避免使用 Long[],因为它比 long[] 多出许多倍。如果您需要使用集合,则可以尝试使用 TLongArrayList,它包装了一个 long[]。


首先提问的前提是我无法避免转换,因为这些原因超出了我的管辖范围。我只是想,如果我无法避免它,那么至少要尽可能聪明地做到。 - Fildor

4
当Java进行装箱/拆箱操作时,它实际上会执行一些操作,即使它不向用户显示。 Long[]long[] 是非常不同的对象。所以答案是,不,你必须循环和复制。但更好的问题是,你为什么需要这个?你几乎可以在任何情况下交替使用它们... 你必须在实现时决定什么对你更重要,是对象创建还是内存使用。希望你使用 Long.valueOf 来创建你的 Long(或自动装箱)来使用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

ArrayUtil 参考文档希望这能有所帮助。

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

1

Java本身没有提供将对象数组转换为基本类型数组的方法。


1

没有比循环和复制更好的方法了,再包装成一个助手函数,您可以一遍又一遍地使用它


0

0

我看到没有人回答相反的情况,即long[]转换为Long[],这里有一个简单的技巧,除了循环之外别无他法!

 int index=0;
 long prim[]={2,100,12,1};
 Long obj[]=new Long[prim.length];
 for(long x:prim){
     res[index++]=x;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接