publicstaticvoidmain(String[] args){ArrayList<String> array =newArrayList<String>();LinkedList<String> link =newLinkedList<String>();//先创建数据for(int i =0; i <10000; i ++){link.add("123"+i);}//插入新数据long startlist2 = System.currentTimeMillis();for(int i =0; i <100000; i ++){link.add(0,"123"+i);}long endTime2 = System.currentTimeMillis();System.out.println("link="+(endTime2-startlist2));//还是分别执行 互不影响/* for(int i = 0; i <10000; i ++){array.add("123"+i);}long startlist = System.currentTimeMillis();for(int i = 0; i <100000; i ++){array.add(0,"123"+i);}long endTime = System.currentTimeMillis();System.out.println("array="+(endTime-startlist));*/}//分别执行3次 看结果//link=63 link=58 link=65//array=3469 array=3398 array=3244
插入速度通过测试得出,linkList直接完爆ArrayList, 这又是为什么呢??? 上源码:
//ArrayList 插入方法 publicvoidadd(int index, E element){rangeCheckForAdd(index);ensureCapacityInternal(size +1);// Increments modCount!!//这里可以看出 插入的时候 是直接调用的arraycopy copy了一个新的数组System.arraycopy(elementData, index, elementData, index +1,size - index);elementData[index]= element;size++;}
ArrayList很粗暴的每次插入都在复制新的数组,
//linkList 先判断是不是最后一个,最好一个调用和刚才新增一样的方法创建对象,不是最后一个 publicvoidadd(int index, E element){checkPositionIndex(index);if(index == size)linkLast(element);elselinkBefore(element,node(index));} //不是最后一个 使用插入方法,新增对象,修改所以对象指针。 voidlinkBefore(E e, Node<E> succ){// assert succ != null;final Node<E> pred = succ.prev;final Node<E> newNode =newNode<>(pred, e, succ);succ.prev = newNode;if(pred == null)first = newNode;elsepred.next = newNode;size++;modCount++;}