【问题标题】:Long[] to long[] and vice versa?长 [] 到长 [] 反之亦然?
【发布时间】:2012-12-01 08:20:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我真的会去循环复制。
  • “没有比循环和复制更好的方法了” :) - Java 的数组类型非常严格。 'Cast-style' 转换不起作用,自动拆箱不适用于数组(还没有?)。
  • Long 对象数组与long 基元数组完全不同。没有什么技巧可以比循环和拆箱更有效地转换它们。

标签: java


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 不错的答案,但我倾向于不使用 3rd 方库。
          • 这不是一个好的答案,它没有解释并且使用循环。
          • @durron597 - 循环是不可避免的。
          • @StephenC 我知道循环是不可避免的,但由于缺乏解释,它会误导读者。
          【解决方案6】:

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

          Convert an array of primitive longs into a List of Longs

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

            • 首先提出这个问题的先决条件是,我无法避免出于我管辖范围之外的原因转换。我只是想,如果我不能避免它,我至少想尽可能聪明地做到这一点。
            猜你喜欢
            • 2012-03-25
            • 1970-01-01
            • 2023-04-07
            • 2019-10-18
            • 1970-01-01
            • 1970-01-01
            • 2014-11-08
            • 2012-02-16
            • 2013-08-16
            相关资源
            最近更新 更多