现在在看Thinking in java.
在Holding your object 章节,Adding groups of elements
看到了Collections.addAll() 方法。接触JAVA一年半,还不知道这个类,惭愧。
有一句话写到:Collections.addAll() runs much faster, and it's just as easy to construct the Collection with no elements and then call Collections.addAll(),which use variable argument lists.
原来跟new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));这种写法相比,还有效率上的差异。马上实验了下。
public class TestAddAll {
public static void main(String[] args) {
long nanoTime1 = System.nanoTime();
for (int i=0;i<10000;i++){
List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
}
long nanoTime2 = System.nanoTime();
for (int i=0;i<10000;i++){
List<Integer> list2 = new ArrayList<Integer>();
Collections.addAll(list2, 1,2,3,4,5);
}
long nanoTime3 = System.nanoTime();
System.out.println(nanoTime2-nanoTime1);
System.out.println(nanoTime3-nanoTime2);
}
}
运行结果:
20106707
10501896
基本上效率是前者的2倍。证实了书上的话。
认识了之前没见过的工具类,而且还从性能上讲了该怎么用,不错。
之前用的时候,都是new出新类,然后一个一个add。看着就不舒服。而且我估计效率也会挺差。是骡子是马拉出来溜溜,于是代码变为
public class TestAddAll {
public static void main(String[] args) {
long nanoTime1 = System.nanoTime();
for (int i=0;i<10000;i++){
List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
}
long nanoTime2 = System.nanoTime();
for (int i=0;i<10000;i++){
List<Integer> list2 = new ArrayList<Integer>();
Collections.addAll(list2, 1,2,3,4,5);
}
long nanoTime3 = System.nanoTime();
for (int i=0;i<10000;i++){
List<Integer> list3 = new ArrayList<Integer>();
list3.add(1);
list3.add(2);
list3.add(3);
list3.add(4);
list3.add(5);
}
long nanoTime4 = System.nanoTime();
System.out.println(nanoTime2-nanoTime1);
System.out.println(nanoTime3-nanoTime2);
System.out.println(nanoTime4-nanoTime3);
}
}
运行结果:
19236681
9910838
4498013
傻眼了,原来的笨写法最快?不能吧。
是我的实验方法有什么问题么?还是我理解的书上说的应用情景错了?望高手指正。