比较ArrayList、LinkedList、Vector
ArrayList 是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.
LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面非常弱于ArrayList.
Vector 和ArrayList类似,但属于强同步类。如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合/对象),那么使用ArrayList是更好的选择。
Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.
而 LinkedList 还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等.
注意: 默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销
以下是测试代码:
public static void main(String[] args) { List<Integer> list1 = new ArrayList<Integer>(); List<Integer> list2 = new LinkedList<Integer>(); int num = 100 * 1000; long time = new Date().getTime(); for(int i=0;i<num;i++){ list1.add(i); } System.out.println("ArrayList add:" + (new Date().getTime() - time));time = new Date().getTime(); for(int i=0;i<num;i++){ list2.add(i); } System.out.println("LinkedList add:" + (new Date().getTime() - time));time = new Date().getTime(); System.out.println("--------------------"); for(int i=0;i<num;i++){ list1.get(i); } System.out.println("ArrayList get:" + (new Date().getTime() - time));time = new Date().getTime(); for(int i=0;i<num;i++){ list2.get(i); } System.out.println("LinkedList get:" + (new Date().getTime() - time));time = new Date().getTime(); System.out.println("--------------------"); for(int i=0;i<num;i++){ list1.set(i,i); } System.out.println("ArrayList set:" + (new Date().getTime() - time));time = new Date().getTime(); for(int i=0;i<num;i++){ list2.set(i,i); } System.out.println("LinkedList set:" + (new Date().getTime() - time));time = new Date().getTime(); System.out.println("--------------------"); for(int i=0;i<num;i++){ list1.remove(0); } System.out.println("ArrayList remove:" + (new Date().getTime() - time));time = new Date().getTime(); for(int i=0;i<num;i++){ list2.remove(0); } System.out.println("LinkedList remove:" + (new Date().getTime() - time));time = new Date().getTime(); System.out.println("--------------------"); }
运行结果:
ArrayList add:10 LinkedList add:0 -------------------- ArrayList get:10 LinkedList get:9878 -------------------- ArrayList set:0 LinkedList set:9829 -------------------- ArrayList remove:4121 LinkedList remove:0 --------------------
从以上代码的运行结果看,在开发过程中使用ArrayList还是LinkedList 是按实际情况去运用的;
浙公网安备 33010602011771号