toArray(new MyObject [size])vs迭代列表并填充数组

时间:2011-04-07 17:09:15

标签: java

以下哪种方法对性能命中是安全的,假设List的大小很大(可能是1,000个对象)。

i)个

List<String> myList = new ArrayList<String>();

for(int i=0; i <=10; i++){
    myList.add(""+i);
}

String[] array = myList.toArray(new String[myList.size()]);

myArrayMethod(array); // this method returns the array - it modifies the content but not size of array.

myListMethod(myList); // this method processes the list.

ⅱ)

List<String> myList = new ArrayList<String>();

for(int i=0; i <=10; i++){
    myList.add(""+i);
}

String[] array = new String[myList.size()];
int i = 0;
for(String str : myList){
   array[i] = myList.get(i);
   i++;
}
myArrayMethod(array); // this method returns the array - it modifies the content but not size of array.

myListMethod(myList); // this method processes the list.

4 个答案:

答案 0 :(得分:3)

第一个例子稍微高效,因为它可以在内部使用System.arraycopy()。

然而,与您正在做的其他事情相比,例如创造弦乐,它会产生一点点差异,我建议你做你认为更清楚的事情

答案 1 :(得分:3)

toArray()可读性更高。

如果你看一下源代码toArray方法,你会注意到有一些条件和arraycopy方法。

// ArrayList.class:
public <T> T[] toArray(T[] a) {
    if (a.length < size) 
        return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size)
        a[size] = null;
    return a;
}

// System.class
public static native void arraycopy // native method

对于大型数组,arraycopy比手动添加要快得多。我测试了它,我检查了i)和ii)的持续时间

  • i)你的第一个例子:toArray
  • ii)您的第二个:手动添加

100 000个元素: i)2毫秒 ii)12毫秒

1 000 000个要素: i)10毫秒 ii)65毫秒

答案 2 :(得分:2)

如果是我的代码,我会选择选项1,因为我只是觉得Collections API会比我更好。

答案 3 :(得分:1)

相对而言,它们具有相同的性能特征,因此,使用内置版本

String[] array = myList.toArray(new String[myList.size()]);