日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

增强型的for循环linkedlist_LinkedList的复习

發(fā)布時間:2023/12/4 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 增强型的for循环linkedlist_LinkedList的复习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

????先摘選一段

@Test
public?void?test_LinkedList()?{
?//?初始化100萬數(shù)據(jù)
????List?list?=?new?LinkedList(1000000);//?遍歷求和int?sum?=?0;for?(int?i?=?0;?i?????????sum?+=?list.get(i);
????}
}
  • 乍一看可能覺得沒什么問題,但是這個遍歷求和會非常慢。主要因為鏈表的數(shù)據(jù)結(jié)構(gòu),每一次list.get(i)都是從鏈表的頭開始查找,與ArrayList不同,LinkedList它時間復雜度是O(n)。那如果說你不知道對方傳過來的是LinkedList還是ArrayList呢,其實可以通過list instanceof RandomAccess?進行判斷。ArrayList?有隨機訪問的實現(xiàn),LinkedList?是沒有。同時也可以使用增強的for循環(huán)或者Iterator進行遍歷。(以上片段來自小傅哥的 握草,你竟然在代碼里下毒!,地址:https://mp.weixin.qq.com/s/q9goqjke-hTsx0_QSH_U1w)
看到這個感覺對linkedList的知識點有點模糊了,有必要簡單復習一下。結(jié)構(gòu)上:LinkedList 底層數(shù)據(jù)結(jié)構(gòu)是一個雙向鏈表,整體結(jié)構(gòu)如下圖所示:

鏈表每個節(jié)點我們叫做 Node,Node 有 prev 屬性,代表前一個節(jié)點的位置,next 屬性,代表后一個節(jié)點的位置;

first 是雙向鏈表的頭節(jié)點,它的前一個節(jié)點是 null。?

last 是雙向鏈表的尾節(jié)點,它的后一個節(jié)點是 null;當鏈表中沒有數(shù)據(jù)時,first 和 last 是同一個節(jié)點,前后指向都是 null;?

因為是個雙向鏈表,只要機器內(nèi)存足夠強大,是沒有大小限制的。

????????因為是鏈表這種結(jié)構(gòu),所以添加刪除比較容易,只要在頭尾節(jié)點進行刪除就行,

而對于ArrayList這種數(shù)組結(jié)構(gòu),還需要判斷進行擴容。

回到上面的問題,為啥get會慢。看源碼就知道了。

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

都是截半然后進行for循環(huán)查找的。

總結(jié)

以上是生活随笔為你收集整理的增强型的for循环linkedlist_LinkedList的复习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。