Long[]
有没有人知道在带有(un)box&copy的明显for循环之外的Java中转换为long[]
反之亦然的有效,快速和干净的方法?
注意:这与拆箱或装箱无关。我明确地谈论数组!Long
long
“没有比循环和复制更好的方法”也是一个答案;)
编辑: 我知道执行上述操作的含义,最好避免这样做。假设,我无法避免它,并且希望在不使用 3rd 方的东西的情况下尽可能聪明地做到这一点。
Long[]
有没有人知道在带有(un)box&copy的明显for循环之外的Java中转换为long[]
反之亦然的有效,快速和干净的方法?
注意:这与拆箱或装箱无关。我明确地谈论数组!Long
long
“没有比循环和复制更好的方法”也是一个答案;)
编辑: 我知道执行上述操作的含义,最好避免这样做。假设,我无法避免它,并且希望在不使用 3rd 方的东西的情况下尽可能聪明地做到这一点。
如果您使用apache commons lang,您可以执行以下操作:
long[] primitive = ArrayUtils.toPrimitive(new Long[]{1L, 2L, 3L, 4L});
没有比循环和复制更好的方法了
最好的解决方案是首先避免转换。如果您担心效率,请避免使用Long[]
,因为它比long[]
如果您需要使用集合大很多倍,您可以尝试包装 long[] 的 TLongArrayList。
当 Java 装箱/拆箱时,它实际上做了一些事情,即使它没有向用户显示它。
Long[]
并且long[]
是非常不同的对象。所以答案是,不,你必须循环和复制。但更好的问题是,你为什么需要这个?您几乎可以在任何情况下交替使用它们……您必须在实现时决定对您来说更重要的是对象创建还是内存使用。希望您使用Long.valueOf
创建Long
s(或自动装箱)来使用 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;
}
Java 本身不提供将对象数组转换为预置数组的任何方法。
ArrayUtil 参考希望这可能会有所帮助。
long[] longs = new long[]{1L};
Long[] longObjects = ArrayUtils.toObject(longs);
List<Long> longList = java.util.Arrays.asList(longObjects);
没有比循环和复制更好的方法了,包裹在一个可以反复使用的辅助函数中。
您可以使用 Apache 中的 ArrayUtils 来执行此操作,如下所述: