List使用需要注意的問題

在Java中,list是我們常用的數(shù)據(jù)結構犀被,一般我們都知道list根據(jù)底層數(shù)據(jù)結構的不同分為兩種類型厕倍,分別是數(shù)組對應的ArrayList和鏈表對應的LinkedList,其特性從底層數(shù)據(jù)結構的不同可以很容易的被我們聯(lián)想到尚氛,大致來說可以分為以下幾個方向

  • 插入和刪除操作的效率:ArrayList在末尾進行插入和刪除操作時效率較高诀诊,因為它可以直接通過下標訪問元素。但是在中間或開頭進行插入和刪除操作時阅嘶,需要移動后續(xù)元素属瓣,效率較低。而LinkedList在任意位置進行插入和刪除操作時效率較高讯柔,因為只需要改變前后節(jié)點的指針即可抡蛙。
  • 隨機訪問的效率:ArrayList可以通過下標直接訪問元素,因此在隨機訪問時效率較高魂迄。而LinkedList需要從頭或尾開始遍歷鏈表粗截,直到找到目標位置,因此在隨機訪問時效率較低捣炬。
  • 內(nèi)存占用:ArrayList每個元素需要額外的空間存儲下標信息熊昌,因此在存儲大量元素時占用的內(nèi)存更大绽榛。而LinkedList每個元素需要額外的空間存儲前后節(jié)點的指針,因此在存儲大量元素時占用的內(nèi)存較小婿屹。

但是很多人不知道在Java中使用list集合還有很多需要注意的坑灭美,今天先在這里記錄幾點

  1. 我們常說的list是指java.util.List包下的,而在java.util.Arrays包下也有一個ArrayList选泻,常見于Arrays.asList方法返回冲粤,也就是說我們常用的數(shù)組轉list的方法返回的是java.util.Arrays包下的list,這是Arrays類里面的一個靜態(tài)內(nèi)部類页眯,它和我們常用的ArrayList一樣繼承了AbstractList梯捕,使用上需要注意的是Arrays的靜態(tài)內(nèi)部類是沒有提供add、remove方法的窝撵,所以如果我們利用上述方法進行數(shù)組轉list的話只能執(zhí)行get操作

  2. list.subList方法的使用傀顾。此方法返回的是原始list的一個子列表視圖,本質(zhì)上是AbstractList的一個內(nèi)部類碌奉,其依然保存有原始列表的結構短曾,如果對這個視圖進行修改的話也會影響到原始列表,并且其add方法是會將數(shù)據(jù)加到最源頭的list上赐劣,看到這里敏感的朋友應該能意識到可能會出現(xiàn)什么問題了

    • 如果這種指代關系太深的話嫉拐,那么就有可能會出現(xiàn)StackOverflowError
    • 當你拿到的這個list只有幾個元素,但其實它所指向的parent列表可能會遠遠超出你的想象魁兼,由此導致內(nèi)存泄漏
  3. ArrayList和LinkedList在不同垃圾回收算法下的表現(xiàn)

    • 標記-清除算法:標記-清除算法通常會遍歷整個內(nèi)存堆婉徘,標記所有活動對象,然后清除未被標記的對象咐汞。在這種情況下盖呼,ArrayList和LinkedList的表現(xiàn)可能相似,因為它們都只是對象的集合化撕,垃圾回收器會以相似的方式處理它們几晤。
    • 復制算法:復制算法將內(nèi)存堆分為兩個區(qū)域,每次只使用其中一個區(qū)域植阴⌒否活動對象被復制到另一個區(qū)域,然后清除當前區(qū)域中的所有對象掠手。在這種情況下热芹,ArrayList和LinkedList的表現(xiàn)可能有所不同。由于ArrayList使用連續(xù)的內(nèi)存塊存儲元素惨撇,復制大型ArrayList可能會更耗時,因為需要復制整個連續(xù)塊府寒。而LinkedList使用鏈表結構魁衙,每個節(jié)點可以被單獨復制报腔,因此在復制算法下,LinkedList可能更高效剖淀。
    • 標記-整理算法:標記-整理算法將存活對象向一端移動纯蛾,然后清除剩余部分。在這種情況下纵隔,ArrayList和LinkedList的表現(xiàn)可能相似翻诉,因為它們都只是對象的集合,垃圾回收器會以相似的方式處理它們捌刮。
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
禁止轉載碰煌,如需轉載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末绅作,一起剝皮案震驚了整個濱河市芦圾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俄认,老刑警劉巖个少,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異眯杏,居然都是意外死亡夜焦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門岂贩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茫经,“玉大人,你說我怎么就攤上這事河闰】破剑” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵姜性,是天一觀的道長瞪慧。 經(jīng)常有香客問我,道長部念,這世上最難降的妖魔是什么弃酌? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮儡炼,結果婚禮上妓湘,老公的妹妹穿的比我還像新娘。我一直安慰自己乌询,他們只是感情好榜贴,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妹田,像睡著了一般唬党。 火紅的嫁衣襯著肌膚如雪鹃共。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天驶拱,我揣著相機與錄音霜浴,去河邊找鬼。 笑死蓝纲,一個胖子當著我的面吹牛阴孟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播税迷,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼永丝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翁狐?” 一聲冷哼從身側響起类溢,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎露懒,沒想到半個月后闯冷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡懈词,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年蛇耀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坎弯。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡纺涤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抠忘,到底是詐尸還是另有隱情撩炊,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布崎脉,位于F島的核電站拧咳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏囚灼。R本人自食惡果不足惜骆膝,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灶体。 院中可真熱鬧阅签,春花似錦、人聲如沸蝎抽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至养交,卻和暖如春衷戈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背层坠。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刁笙,地道東北人破花。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像疲吸,于是被迫代替她去往敵國和親座每。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容