box / unbox多维原始数组的最有效方法

时间:2011-04-05 14:39:35

标签: java algorithm

这是在没有使用外部库的情况下用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;
}

使用外部库最有效率是什么?

2 个答案:

答案 0 :(得分:3)

这里没有魔法:这就是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;
}

source

答案 1 :(得分:2)

我认为我不这样做。如果阵列不是真正的“矩形”,它将失败。我会做类似的事情:

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无论如何都可以优化。 (可能不适用于源阵列,当然可能会在幕后改变......)