在不使用外部库的情况下,在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可以进行优化,我也不会感到惊讶。(可能不是源数组,它可能在幕后改变,当然…)