Java ArrayList 和 LinkedList 区别

想做一个购物清单:每次要加新商品、删过期的,还得随时查“第三样是什么”,用什么工具最顺手?如果是Java里的集合工具,ArrayList和LinkedList就是两种常用的“清单”,但它们的用法差很多,选不对会白忙活。

先搞懂:它们本质是存东西的方式不一样

你可以把ArrayList想象成一排连起来的空格子货架,每个格子都有固定的编号,就像小区的门牌号。你每次加东西,要是货架没满,就直接塞到对应的空格子里,门牌号不会乱;要是删东西,后面的格子会自动往前挪补位,门牌号也跟着变,但不会空出位置。

Java ArrayList 和 LinkedList 区别

而LinkedList更像一串用绳子串起来的珠子,每颗珠子(叫“节点”)不仅存商品本身,还会记上“前一颗珠子在哪”“后一颗珠子在哪”。你要加东西,不用找固定位置,直接串到绳子中间就行,不用挪别的珠子;要删东西,只要把前后两颗珠子的绳子连起来,中间的就掉了,也不用挪。

查、加、删:日常操作的速度差在哪?

拿你翻购物清单的日常操作举例,这两种“清单”的速度差特别明显:

  • 查东西(比如找“第五样商品”):用ArrayList就像按门牌号找,报个“5号”,直接走到第五个格子,一秒就能拿到;但LinkedList得从第一颗珠子开始,一颗一颗数到第五个,要数四次才到,越往后越慢。
  • 加东西(比如在中间插个“纸巾”):要是在列表末尾加,两种都差不多快;但要是插在中间——ArrayList得把插的位置后面的所有格子往后挪,比如原来有5个格子,插在第2个,就要把第2、3、4、5的东西都往后移一个格子,还要改门牌号,慢得很;LinkedList只要找到要插的位置的前后珠子,把新珠子串上去就行,不用动别的,快很多。
  • 删东西(比如删掉第三个过期的“面包”):ArrayList要把第三个后面的所有东西往前挪补位,比如删了第3个,第4、5的东西都要移到第3、4位,改门牌号,麻烦;LinkedList只要把第2颗和第4颗的绳子连上,第3颗就掉了,不用挪,也快。

什么时候该用哪个?别搞混

既然速度差这么大,选的时候看你平时用得最多的操作就行:

  • 要是你做的清单,经常查东西、改内容,加删主要在末尾——比如存班级通讯录、商品列表,很少插中间删中间,选ArrayList准没错,毕竟找起来快,日常用顺手。
  • 要是你经常在中间加东西、删东西,很少挨个查序号——比如做待办事项(随时插个紧急的在中间)、任务队列,选LinkedList更省时间,不用挪一堆内容。

其实不管选哪个,核心就是“匹配需求”,就像你买收纳盒,要放经常拿的小物件,选抽屉式的(对应ArrayList);要经常串起来加拆的小零件,选串珠式的(对应LinkedList),选对了,用起来就省心。

上一篇 C / C++ 从基础语法到高级特性,编程入门与进阶的核心知识科普