用代码测了一下(jdk 5)。主要是觉得 System.arraycopy 可能是最快的。结果出乎意料。
import
java.util.Date;
public class ArrayCopyTest ... {
public static void main(String[] args) ...{
new ArrayCopyTest().arrayCopy();
}
void arrayCopy() ...{
int loop = 10000000;
Object[] srcArray1 = ...{ "sdfsdaf", new Date(), new Integer(200) };
Object[] srcArray2 = ...{ "qwerasd", new Date(), new Integer(200), srcArray1, new Object(),
new String[] ...{ "aaa", "bbb" } };
System.out.println("short array");
arrayClone(loop, srcArray1);
arrayManualCopy(loop, srcArray1);
arraySysCopy(loop, srcArray1); // was srcArray2);
System.out.println(" long array");
arrayClone(loop, srcArray2);
arrayManualCopy(loop, srcArray2);
arraySysCopy(loop, srcArray2);
}
void arrayClone(int loop, Object[] sourceArray) ...{
long time = System.currentTimeMillis();
for (int i = 0; i < loop; ++i) ...{
Object[] destArray = (Object[]) sourceArray.clone();
}
System.out.println("arrayClone " + (System.currentTimeMillis() - time));
}
void arraySysCopy(int loop, Object[] sourceArray) ...{
long time = System.currentTimeMillis();
for (int i = 0; i < loop; ++i) ...{
Object[] destArray = new Object[sourceArray.length];
System.arraycopy(sourceArray, 0, destArray, 0, sourceArray.length);
}
System.out.println("arraySysCopy " + (System.currentTimeMillis() - time));
}
void arrayManualCopy(int loop, Object[] sourceArray) ...{
long time = System.currentTimeMillis();
for (int i = 0; i < loop; ++i) ...{
Object[] destArray = new Object[sourceArray.length];
for(int j=0; j<sourceArray.length; ++j)...{
destArray[j] = sourceArray[j];
}
}
System.out.println("arrayManulCopy " + (System.currentTimeMillis() - time));
}
}
public class ArrayCopyTest ... {
public static void main(String[] args) ...{
new ArrayCopyTest().arrayCopy();
}
void arrayCopy() ...{
int loop = 10000000;
Object[] srcArray1 = ...{ "sdfsdaf", new Date(), new Integer(200) };
Object[] srcArray2 = ...{ "qwerasd", new Date(), new Integer(200), srcArray1, new Object(),
new String[] ...{ "aaa", "bbb" } };
System.out.println("short array");
arrayClone(loop, srcArray1);
arrayManualCopy(loop, srcArray1);
arraySysCopy(loop, srcArray1); // was srcArray2);
System.out.println(" long array");
arrayClone(loop, srcArray2);
arrayManualCopy(loop, srcArray2);
arraySysCopy(loop, srcArray2);
}
void arrayClone(int loop, Object[] sourceArray) ...{
long time = System.currentTimeMillis();
for (int i = 0; i < loop; ++i) ...{
Object[] destArray = (Object[]) sourceArray.clone();
}
System.out.println("arrayClone " + (System.currentTimeMillis() - time));
}
void arraySysCopy(int loop, Object[] sourceArray) ...{
long time = System.currentTimeMillis();
for (int i = 0; i < loop; ++i) ...{
Object[] destArray = new Object[sourceArray.length];
System.arraycopy(sourceArray, 0, destArray, 0, sourceArray.length);
}
System.out.println("arraySysCopy " + (System.currentTimeMillis() - time));
}
void arrayManualCopy(int loop, Object[] sourceArray) ...{
long time = System.currentTimeMillis();
for (int i = 0; i < loop; ++i) ...{
Object[] destArray = new Object[sourceArray.length];
for(int j=0; j<sourceArray.length; ++j)...{
destArray[j] = sourceArray[j];
}
}
System.out.println("arrayManulCopy " + (System.currentTimeMillis() - time));
}
}
不太理解,一时也没有够好的分析手段。
学无止境,没完没了。
(第二次发文。上次居然遇上了服务器出错。倒霉。)