装箱/拆箱多维原语数组的最有效方法



在不使用外部库的情况下,在Java中装箱/拆箱多维原语数组是最有效的方法吗?

private Float[][] toFloatArray(float[][] values)
{
   Float[][] objArray = new Float[values.length][values[0].length];
   for (int i = 0; i < values.length; i++)
   {
      for (int j = 0; j < values[0].length; j++)
      {
         objArray[i][j] = values[i][j];
       }
   } 
   return objArray;
}

使用外部库最有效的方法是什么?

这里没有魔法:当你使用apache-commons的库时,这就是这样做的:

public static short[] toPrimitive(Short[] array) {
    if (array == null) {
        return null;
    } else if (array.length == 0) {
        return EMPTY_SHORT_ARRAY;
    }
    final short[] result = new short[array.length];
    for (int i = 0; i < array.length; i++) {
        result[i] = array[i].shortValue();
    }
    return result;
}

我不认为我会那样做。如果数组不是真正的"矩形",它将失败。我会这样做:

private Float[][] toFloatArray(float[][] values)
{
   Float[][] objArray = new Float[values.length][];
   for (int i = 0; i < values.length; i++)
   {
      objArray[i] = new Float[values[i].length];
      for (int j = 0; j < values[i].length; j++)
      {
         objArray[i][j] = values[i][j];
      }
   } 
   return objArray;
}

可能能够通过移除中间数组访问进行微优化:

private Float[][] toFloatArray(float[][] values)
{
   Float[][] objArray = new Float[values.length][];
   for (int i = 0; i < values.length; i++)
   {
      float[] subSource = values[i];
      Float[] subDest = new Float[subSource.length];
      objArray[i] = subDest;
      for (int j = 0; j < subSource.length; j++)
      {
         subDest[j] = subSource[j];
      }
   } 
   return objArray;
}

…但如果发现好的jit可以进行优化,我也不会感到惊讶。(可能不是源数组,它可能在幕后改变,当然…)

最新更新