原文来自于:https://zha-ge.cn/java/45
聊聊我和 ArrayList、LinkedList、Vector 的"一地鸡毛"
Java 的这仨 List,你可能觉得早都烂熟于心了------但真用到项目里,坑声四起。下面就随我一起,八一八我和这三位"表哥"之间爱恨纠缠的小故事。放心,咱不是刷题,是掏心窝子的聊天~
回忆杀:初识"三兄弟"
第一次学 Java 集合,老师一边敲黑板一边念叨:
- ArrayList:用得最多,底层数组,查询快,增删慢;
- LinkedList:链表实现,插入删除爽到飞起,查找就很丧气。
- Vector:线程安全版 ArrayList,老古董,慎用。
我点点头,心里想:"谁还不能背两句口诀?"
可现实总是啪啪打脸。
真香 or 真坑?项目里的瞬间闪回
做项目那会儿,初生牛犊,脑子里只有 ArrayList。见啥 list 就 new ArrayList,根本不想别的。
某天搞批量插入,发现性能死慢死慢。代码关键部分是这样的:
java
for (int i = 0; i < data.length; i++) {
myList.add(0, data[i]);
// ..........
}
老天爷,头一次感受到什么叫 "查询快,插入慢"。每加一条,后面的元素要挪窝,难怪 CPU 风扇吹得欢实。
切换成 LinkedList,一下子丝滑,仿佛给代码上了润滑油。
踩坑瞬间
踩坑合集来啦,不藏私!
- 插队惹祸:批量在头部插入数据,ArrayList 性能炸裂,LinkedList 不疼不痒。
- Vector 的冷宫 :被同事一通吐槽,才意识到 Vector 性能差、不推荐,基本没人再用。同步你以为很香?不如用
Collections.synchronizedList
吧。 - 遍历翻车:用 LinkedList 频繁下标访问,发现慢到怀疑人生。链表没下标的命,硬要它干数组的活儿,吃力还不讨好。
小结------这仨到底咋选?
说真的,写了这么久,踩过各种坑,才慢慢摸出这点门道:
- ArrayList:日常首选,查询多、插入删除少,用它没毛病。
- LinkedList:头尾插入、删除频繁的小场合,想要刀头舔血的快感?它最适合。
- Vector:单线程时代的遗物,除非你在整理遗产,否则请离它远点。
- 别忘了:线程安全?要么自己加锁,要么 Collections.synchronizedList。
经验启示
- 千万别机械背"口诀",要真明白底层实现。
- 选对工具,就像提对武器,写代码才能游刃有余。
- 踩过的坑,都变成了"前车之鉴"。你问我怎么理解 List?多敲代码,多出 bug,没有一条是白费的。
晚上写到这里肚子又饿了,得,收个尾巴。
希望你别和我一样,因为 List 选型把自己折腾进 ICU。祝大家永远追风少年,头发茂密,bug 少一点,踩坑也别太疼!