日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java中LinkedList真的是查找慢增刪快

瀏覽:36日期:2022-08-22 13:27:03

測試結(jié)果

廢話不多說,先上測試結(jié)果。作者分別在ArrayList和LinkedList的頭部、尾部和中間三個(gè)位置插入與查找100000個(gè)元素所消耗的時(shí)間來進(jìn)行對比測試,下面是測試結(jié)果

(感謝@Hosalo的指正,在這里說明一下測試的環(huán)境,尾部插入是在空表的基礎(chǔ)上測試的,頭部和中間位置插入是在已存在100000個(gè)元素的表上進(jìn)行測試的)

插入 查找 ArrayList尾部 26ms 4ms ArrayList頭部 2887ms 3ms ArrayList中間 1936ms 4ms LinkedList尾部 28ms 9ms LinkedList頭部 15ms 11ms LinkedList中間 12310ms 11387ms

測試結(jié)論

ArrayList的查找性能絕對是一流的,無論查詢的是哪個(gè)位置的元素 ArrayList除了尾部插入的性能較好外(位置越靠后性能越好),其他位置性能就不如人意了 LinkedList在頭尾查找、插入性能都是很棒的,但是在中間位置進(jìn)行操作的話,性能就差很遠(yuǎn)了,而且跟ArrayList完全不是一個(gè)量級的

源碼分析

我們把Java中的ArrayList和LinkedList就是分別對順序表和雙向鏈表的一種實(shí)現(xiàn),所以在進(jìn)行源碼分析之前,我們先來簡單回顧一下數(shù)據(jù)結(jié)構(gòu)中的順序表與雙向鏈表中的關(guān)鍵概念

順序表:需要申請連續(xù)的內(nèi)存空間保存元素,可以通過內(nèi)存中的物理位置直接找到元素的邏輯位置。在順序表中間插入or刪除元素需要把該元素之后的所有元素向前or向后移動。 雙向鏈表:不需要申請連續(xù)的內(nèi)存空間保存元素,需要通過元素的頭尾指針找到前繼與后繼元素(查找元素的時(shí)候需要從頭or尾開始遍歷整個(gè)鏈表,直到找到目標(biāo)元素)。在雙向鏈表中插入or刪除元素不需要移動元素,只需要改變相關(guān)元素的頭尾指針即可。

所以我們潛意識會認(rèn)為:ArrayList查找快,增刪慢。LinkedList查找慢,增刪快。但實(shí)際上真的是這樣的嗎?我們一起來看看吧。

測試程序

測試程序代碼基本沒有什么營養(yǎng),這里就不貼出來了,但是得把程序的運(yùn)行結(jié)果貼出來,方便逐個(gè)分析。

運(yùn)行結(jié)果

ArrayList尾部插入100000個(gè)元素耗時(shí):26msLinkedList尾部插入100000個(gè)元素耗時(shí):28msArrayList頭部插入100000個(gè)元素耗時(shí):859msLinkedList頭部插入100000個(gè)元素耗時(shí):15msArrayList中間插入100000個(gè)元素耗時(shí):1848msLinkedList中間插入100000個(gè)元素耗時(shí):15981msArrayList頭部讀取100000個(gè)元素耗時(shí):7msLinkedList頭部讀取100000個(gè)元素耗時(shí):11msArrayList尾部讀取100000個(gè)元素耗時(shí):12msLinkedList尾部讀取100000個(gè)元素耗時(shí):9msArrayList中間讀取100000個(gè)元素耗時(shí):13msLinkedList中間讀取100000個(gè)元素耗時(shí):11387ms

ArrayList尾部插入

源碼

add(E e)方法 public boolean add(E e) { // 檢查是否需要擴(kuò)容 ensureCapacityInternal(size + 1); // Increments modCount!! // 直接在尾部添加元素 elementData[size++] = e; return true; }

可以看出,對ArrayList的尾部插入,直接插入即可,無須額外的操作。

LinkedList尾部插入

源碼

LinkedList中定義了頭尾節(jié)點(diǎn) /** * Pointer to first node. */ transient Node<E> first; /** * Pointer to last node. */ transient Node<E> last;

add(E e)方法,該方法中調(diào)用了linkLast(E e)方法

public boolean add(E e) { linkLast(e); return true; }

linkLast(E e)方法,可以看出,在尾部插入的時(shí)候,并不需要從頭開始遍歷整個(gè)鏈表,因?yàn)橐呀?jīng)事先保存了尾結(jié)點(diǎn),所以可以直接在尾結(jié)點(diǎn)后面插入元素

/** * Links e as last element. */ void linkLast(E e) { // 先把原來的尾結(jié)點(diǎn)保存下來 final Node<E> l = last; // 創(chuàng)建一個(gè)新的結(jié)點(diǎn),其頭結(jié)點(diǎn)指向last final Node<E> newNode = new Node<>(l, e, null); // 尾結(jié)點(diǎn)置為newNode last = newNode; if (l == null) first = newNode; else // 修改原先的尾結(jié)點(diǎn)的尾結(jié)點(diǎn),使其指向新的尾結(jié)點(diǎn) l.next = newNode; size++; modCount++; }

總結(jié)

對于尾部插入而言,ArrayList與LinkedList的性能幾乎是一致的

ArrayList頭部插入

源碼

add(int index, E element)方法,可以看到通過調(diào)用系統(tǒng)的數(shù)組復(fù)制方法來實(shí)現(xiàn)了元素的移動。所以,插入的位置越靠前,需要移動的元素就會越多

public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!! // 把原來數(shù)組中的index位置開始的元素全部復(fù)制到index+1開始的位置(其實(shí)就是index后面的元素向后移動一位) System.arraycopy(elementData, index, elementData, index + 1, size - index); // 插入元素 elementData[index] = element; size++; }

LinkedList頭部插入

源碼

add(int index, E element)方法,該方法先判斷是否是在尾部插入,如果是調(diào)用linkLast()方法,否則調(diào)用linkBefore(),那么是否真的就是需要重頭開始遍歷呢?我們一起來看看

public void add(int index, E element) { checkPositionIndex(index); if (index == size) linkLast(element); else linkBefore(element, node(index)); }

在頭尾以外的位置插入元素當(dāng)然得找出這個(gè)位置在哪里,這里面的node()方法就是關(guān)鍵所在,這個(gè)函數(shù)的作用就是根據(jù)索引查找元素,但是它會先判斷index的位置,如果index比size的一半(size >> 1,右移運(yùn)算,相當(dāng)于除以2)要小,就從頭開始遍歷。否則,從尾部開始遍歷。從而可以知道,對于LinkedList來說,操作的元素的位置越往中間靠攏,效率就越低

Node<E> node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++)x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--)x = x.prev; return x; } }

這個(gè)函數(shù)的工作就只是負(fù)責(zé)把元素插入到相應(yīng)的位置而已,關(guān)鍵的工作在node()方法中已經(jīng)完成了

void linkBefore(E e, Node<E> succ) { // assert succ != null; final Node<E> pred = succ.prev; final Node<E> newNode = new Node<>(pred, e, succ); succ.prev = newNode; if (pred == null) first = newNode; else pred.next = newNode; size++; modCount++; }

總結(jié)

對于LinkedList來說,頭部插入和尾部插入時(shí)間復(fù)雜度都是O(1) 但是對于ArrayList來說,頭部的每一次插入都需要移動size-1個(gè)元素,效率可想而知 但是如果都是在最中間的位置插入的話,ArrayList速度比LinkedList的速度快將近10倍

ArrayList、LinkedList查找

這就沒啥好說的了,對于ArrayList,無論什么位置,都是直接通過索引定位到元素,時(shí)間復(fù)雜度O(1) 而對于LinkedList查找,其核心方法就是上面所說的node()方法,所以頭尾查找速度極快,越往中間靠攏效率越低

到此這篇關(guān)于Java中LinkedList真的是查找慢增刪快 的文章就介紹到這了,更多相關(guān)Java LinkedList查找慢增刪快 內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品国产免费| 99久久久久久中文字幕一区| 国产免费成人| 欧美综合国产| 日韩精品国产精品| 国产亚洲字幕| 国内精品亚洲| 黄色在线网站噜噜噜| 国产精品v日韩精品v欧美精品网站| 欧美日韩精品一区二区三区在线观看| 欧美一区二区三区久久| 麻豆精品99| 欧美天堂视频| 国产视频一区在线观看一区免费| 中文字幕一区二区精品区| 日韩不卡一二三区| 久久99蜜桃| 色婷婷精品视频| 性一交一乱一区二区洋洋av| 日韩高清一级| 精品入口麻豆88视频| 亚洲第一精品影视| 亚洲麻豆一区| 精品一区二区三区亚洲| 欧美片第1页| 视频一区视频二区中文| 91亚洲精品视频在线观看| 精品一区二区三区中文字幕视频 | 9色国产精品| 日本成人中文字幕| 国产aⅴ精品一区二区三区久久| 欧美日韩一区二区综合| 热久久免费视频| 久久不见久久见国语| 新版的欧美在线视频| 免费国产亚洲视频| 精品日产乱码久久久久久仙踪林| 美女久久久久| 国产精品sss在线观看av| 久久精品影视| 欧美一区不卡| 亚洲福利久久| 国产亚洲久久| 激情久久婷婷| 美女久久久精品| 亚洲综合精品四区| 国产成人在线中文字幕| 久久国产高清| 97视频热人人精品免费| 亚洲91网站| 午夜av成人| 久久精品72免费观看| 亚洲婷婷在线| 91视频一区| 国产欧美高清视频在线| 在线视频精品| 日韩欧美一区二区三区免费看| xxxxx性欧美特大| 欧美日韩伊人| 日韩中文字幕麻豆| 久久在线视频免费观看| 国产精品xxx| 日韩在线a电影| 99久久久久| 久久久久久色 | 婷婷亚洲综合| 国产粉嫩在线观看| 国产亚洲一区二区三区啪| 影院欧美亚洲| 日韩黄色大片网站| 国产精品美女在线观看直播| 亚洲欧美日韩国产| 999久久久国产精品| 久久精品免视看国产成人| 亚洲制服一区| 久久国产精品亚洲77777| 精精国产xxxx视频在线野外| 国产精品亚洲综合在线观看| 亚洲精品一级| 亚洲尤物av| 在线免费观看亚洲| 亚洲女同一区| 亚洲福利免费| 99久久视频| 久久久久久久久久久妇女| 国产一区二区三区不卡av| 久久99视频| 欧美激情福利| 日韩va欧美va亚洲va久久| 亚洲在线国产日韩欧美| 午夜日韩在线| 伊人成人网在线看| 久久国产欧美| 日韩精品免费一区二区在线观看| 国产一区二区三区探花| 久久精品国产成人一区二区三区| 日韩av一级片| 日韩av资源网| 日韩高清三区| 国产欧美欧美| 精品无人区麻豆乱码久久久| 精品视频一二| 日韩欧美另类一区二区| 亚洲福利一区| 欧美日韩一二三四| 99综合视频| 中文字幕日韩亚洲| 日韩高清二区| 久久精品理论片| 在线亚洲人成| 国产一区清纯| 伊人久久大香伊蕉在人线观看热v| 亚洲一区二区三区中文字幕在线观看| 日韩精品一区二区三区免费视频| 香蕉久久一区| 国产精品一卡| 亚洲伊人av| 亚洲欧美伊人| 日韩高清在线一区| 久久不见久久见国语| 丁香六月综合| 另类激情亚洲| 国产另类在线| 中文字幕在线看片| 午夜精品一区二区三区国产| 日av在线不卡| 国产精品3区| av亚洲一区二区三区| 五月天久久网站| 日韩国产高清在线| 国产精品久久久久久久免费观看| 欧美不卡高清| 日本视频在线一区| 岛国av在线播放| 欧美日韩国产一区精品一区| 亚洲精品伊人| 国产福利91精品一区二区| 在线国产一区二区| 欧美亚洲专区| 亚洲手机视频| 国产欧美日韩一级| 欧美1区2区3区| 国产亚洲欧美日韩在线观看一区二区| 欧美激情另类| 亚洲丝袜啪啪| 福利精品一区| 一本综合精品| 97人人精品| 亚洲三级毛片| 九九久久国产| 蜜臀av一区二区在线免费观看| 老鸭窝一区二区久久精品| 亚洲精品91| 久久精品国产免费| 水野朝阳av一区二区三区| 欧美精品不卡| 99国产精品久久久久久久成人热 | 成人片免费看| 91亚洲无吗| 午夜久久美女| 精品国产乱码久久久久久樱花| 欧美日韩中文字幕一区二区三区 | 亚洲欧美网站| 97欧美在线视频| 久久精品 人人爱| 在线视频亚洲| 日韩久久电影| 国产日韩亚洲| 午夜在线精品偷拍| 蜜桃av.网站在线观看| 国产日韩一区| 久久亚洲影院| 免费高潮视频95在线观看网站| 国产精品亚洲二区| 久久大逼视频| 免费观看不卡av| 日本在线高清| 精品不卡一区| 欧美日韩一视频区二区| 老司机久久99久久精品播放免费| а√天堂8资源在线| 国产精品一线| 婷婷综合福利| 99视频一区| 亚洲视频综合| 日本美女一区| av资源中文在线| 麻豆久久一区| 国产欧美日韩精品一区二区免费| 国产午夜精品一区二区三区欧美| 日韩精品1区| 韩国久久久久久| 成人国产精品一区二区免费麻豆| 国产精品综合| 国产精品一区二区精品| 国产一级成人av| 久久精品av麻豆的观看方式| 日韩精品欧美大片| 婷婷亚洲成人| 亚洲免费专区|