在已有数据的linkedList和arrayList集合中在中间位置新插入一条数据谁更快
以前一直以為是linked中間插入和頭部插入都是比arrayList快的,今天開會的時候談到這個面試題,這里就重新認(rèn)識一下這兩個集合。
結(jié)論:不想存在性能瓶頸,不是一定要linkedlist的場景就使用arraylist就可以了,除了頭插,arraylist基本都是優(yōu)于linkedlist的
1.中間插入數(shù)據(jù)
linkedlist:
中間插入數(shù)據(jù)linkedlist是需要遍歷移動和new node節(jié)點的
arraylist:
arraylist可能需要擴(kuò)容和一定要移動數(shù)據(jù)的,但是arraylist使用的system.ArrayCopy進(jìn)行擴(kuò)容和移動數(shù)據(jù)是非常高效的,直接內(nèi)存地址拷貝,然后賦值
移動數(shù)據(jù):理解一下System.arraycopy(elementData, index, elementData, index + 1, size - index);這行代碼就會發(fā)現(xiàn)他只是將中間索引位置后面的數(shù)據(jù)直接copy到當(dāng)前數(shù)組后一位的上
擴(kuò)容:arraylist不一定需要擴(kuò)容,每次擴(kuò)容是原來的1.5倍,但是通過設(shè)置插入元素數(shù),來保證他一定擴(kuò)容進(jìn)行測試,arraylist的速度還是更快。
測試程序
public void test_ArrayList() {ArrayList<Integer> list = new ArrayList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 106710; i++) {list.add( i);}System.out.println("初始化耗時:" + (System.nanoTime() - startTime));startTime = System.nanoTime();list.add(list.size() >> 1, 1);System.out.println("耗時:" + (System.nanoTime() - startTime));}@Testpublic void test_LinkedList() {LinkedList<Integer> list = new LinkedList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 106710; i++) {list.add(i);}System.out.println("初始化耗時:" + (System.nanoTime() - startTime));startTime = System.nanoTime();list.add(list.size() >> 1, 1);System.out.println("耗時:" + (System.nanoTime() - startTime));}2.頭插入
頭插入linkedlist就比arraylist快很多了,即便是arraylist不需要擴(kuò)容,也比不過linkedlist
因為linkedlist唯一耗時的地方就是new一個node節(jié)點
代碼
@Testpublic void test_ArrayList_addCenter() {ArrayList<Integer> list = new ArrayList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 100000; i++) {list.add( i);}System.out.println("初始化耗時:" + (System.nanoTime() - startTime));startTime = System.nanoTime(); // list.add(list.size() >> 1, 1);list.add(0,1);System.out.println("耗時:" + (System.nanoTime() - startTime));}@Testpublic void test_LinkedList_addCenter() {LinkedList<Integer> list = new LinkedList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 100000; i++) {list.addFirst(i);}System.out.println("初始化耗時:" + (System.nanoTime() - startTime));startTime = System.nanoTime(); // list.add(list.size() >> 1, 1);list.add(1);System.out.println("耗時:" + (System.nanoTime() - startTime));}3.尾插入
arraylist沒擴(kuò)容 基本持平,插入速度差不多,擴(kuò)容的話linkedlist快一些
兩組測試
3.1沒擴(kuò)容
3.2進(jìn)行擴(kuò)容
@Testpublic void test_ArrayList_addCenter() {ArrayList<Integer> list = new ArrayList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 106710; i++) {list.add( i);}System.out.println("初始化耗時:" + (System.nanoTime() - startTime));startTime = System.nanoTime(); // list.add(list.size() >> 1, 1);list.add(1);System.out.println("耗時:" + (System.nanoTime() - startTime));}@Testpublic void test_LinkedList_addCenter() {LinkedList<Integer> list = new LinkedList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 106710; i++) {list.add(i);}System.out.println("初始化耗時:" + (System.nanoTime() - startTime));startTime = System.nanoTime(); // list.add(list.size() >> 1, 1);list.add(1);System.out.println("耗時:" + (System.nanoTime() - startTime));}測試結(jié)果就不截圖了,有興趣自己去跑一跑,debug看一看源碼
總結(jié)
以上是生活随笔為你收集整理的在已有数据的linkedList和arrayList集合中在中间位置新插入一条数据谁更快的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 页面404 微软封杀俄罗斯用户:官网禁止
- 下一篇: 养猪的正邦科技跨界进军新能源 股票涨停