有人知道在Java中将Long[]
转换为long[]
以及相反的高效、快速、干净的方法吗?除了使用(反)装箱循环,有没有更好的方法?
注意:这不是关于拆箱Long
或装箱long
。我明确在谈论数组!
"没有比循环和复制更好的方法"也可以成为一个答案;)
编辑: 我意识到上面做法的影响,并且最好是避免它。但请假设我无法避免它,并且希望尽可能智能地执行它,而不使用第三方工具。
有人知道在Java中将Long[]
转换为long[]
以及相反的高效、快速、干净的方法吗?除了使用(反)装箱循环,有没有更好的方法?
注意:这不是关于拆箱Long
或装箱long
。我明确在谈论数组!
"没有比循环和复制更好的方法"也可以成为一个答案;)
编辑: 我意识到上面做法的影响,并且最好是避免它。但请假设我无法避免它,并且希望尽可能智能地执行它,而不使用第三方工具。
如果你使用apache commons lang,你可以这样做:
long[] primitive = ArrayUtils.toPrimitive(new Long[]{1L, 2L, 3L, 4L});
循环和复制是最好的方法
最好的解决方案是在一开始就避免转换。如果您担心效率,请避免使用 Long[]
,因为它比 long[]
多出许多倍。如果您需要使用集合,则可以尝试使用 TLongArrayList,它包装了一个 long[]。
Long[]
和 long[]
是非常不同的对象。所以答案是,不,你必须循环和复制。但更好的问题是,你为什么需要这个?你几乎可以在任何情况下交替使用它们... 你必须在实现时决定什么对你更重要,是对象创建还是内存使用。希望你使用 Long.valueOf
来创建你的 Long
(或自动装箱)来使用Java的缓存 Long
值。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;
}
ArrayUtil 参考文档希望这能有所帮助。
long[] longs = new long[]{1L};
Long[] longObjects = ArrayUtils.toObject(longs);
List<Long> longList = java.util.Arrays.asList(longObjects);
Java本身没有提供将对象数组转换为基本类型数组的方法。
没有比循环和复制更好的方法了,再包装成一个助手函数,您可以一遍又一遍地使用它。
我看到没有人回答相反的情况,即long[]转换为Long[],这里有一个简单的技巧,除了循环之外别无他法!
int index=0;
long prim[]={2,100,12,1};
Long obj[]=new Long[prim.length];
for(long x:prim){
res[index++]=x;
}
Long
对象数组和一个long
原始类型数组是完全不同的。没有比循环和拆箱更有效的转换方法。 - Jesper