别再乱 new ArrayList!8 大 Java 容器选型案例,一篇看懂

你是不是也这样过?写代码,一上来就是:

java
复制代码
List<String> list = new ArrayList<>();

管它三七二十一,先new一个ArrayList再说!

我以前也是这样。直到有一次,线上接口慢得像蜗牛,排查半天,发现是某个地方用了ArrayList存了几万条数据,还频繁删除插入……直接卡崩了。

容器用错了,性能能差十倍不止。

下面记录一下。

1. ArrayList:适合读多写少

你从数据库拉了一堆用户列表,展示用,基本不改。这种情况,ArrayList是首选。

java
复制代码
List<User> users = userService.getAllUsers(); for (User u : users) { render(u); // 大部分是读操作 } // 后面全是遍历展示,不增不删

它的优点是按位置访问快。你要是在中间insertremove,它就得把后面的元素全往后挪,特别耗时。

所以,要是频繁插入删除的操作,别用ArrayList

2. LinkedList:适合链式操作的场景

有次我们做后台管理,要支持“撤销上一步”功能。比如用户连续改了 5 次标题,点撤销,就得一步步退回去。

最开始用ArrayList存操作记录:

java
复制代码
List<EditAction> history = new ArrayList<>();

每次撤销,都要remove最后一条。结果数据一多,删除慢得不行,界面卡顿。

后来换成LinkedList

java
复制代码
LinkedList<EditAction> history = new LinkedList<>();

因为是链表结构,删最后一个节点,O(1) 就搞定。而且我们还用它当栈使用:

java
复制代码
history.addLast(action); // 入栈 history.removeLast(); // 出栈,撤销

LinkedList的头尾操作天生就快,指针一指,完事。

3. HashMap:日常键值存储

用户登录后,把基本信息缓存在内存里。

java
复制代码
Map<Long, User> userMap = new HashMap<>(); userMap.put(user.getId(), user); User target = userMap.get(10086L);

查得快,写得也快,日常开发用得最多。但注意,它不保证顺序,也不支持并发。

4. LinkedHashMap:要顺序,就它了

有时候你希望Map的遍历顺序和插入顺序一致。比如记录用户操作日志,按时间顺序存。

java
复制代码
Map<String, Action> log = new LinkedHashMap<>(); log.put("login", loginAction); log.put("pay", payAction); // 遍历时,先 login,后 pay

遍历时,最近访问的在前面。而且插入顺序固定,前端展示不乱。

5. TreeMap:需要自动排序

你要按分数给学生排名,key是分数。用TreeMap,它自动按key排好。

java
复制代码
Map<Integer, String> rank = new TreeMap<>(); rank.put(95, "张三"); rank.put(88, "李四"); // 遍历出来就是按分数从小到大

遍历出来就是有序的。虽然比HashMap慢点,但省了你手动排序的麻烦。


总结一下

需求推荐用
普通列表,读多写少ArrayList
头尾增删频繁ArrayDeque
键值对,快HashMap
要保持插入顺序LinkedHashMap
key 需要排序TreeMap
多线程写 MapConcurrentHashMap
多线程读多写少 ListCopyOnWriteArrayList
队列或栈ArrayDeque

容器不是随便选的。用对了,程序跑得稳;用错了,半夜叫你修 bug。

原创
作者: IT刘大华
程序员刘大华

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
阿生
作者分享
关于技术洁癖这块,首先说明,本人菜鸡一枚,就有感而发一下,大佬勿喷。 从一开始在学校接触spring框架开始,跟的黑马的课程,一开始用的 @Autowired 注入,从基础入门到写完苍穹外卖都是这个注解,后来跟着鱼皮做了俩个项目,发现鱼皮喜欢用 @Resource 注解, 鱼皮是腾讯大厂出来的,实力这块跟着大佬用就对了。,而且 @Autowired 注解 ide 还飘黄,于是就开始使用 @Resource。再到后来了解到黑马的天机学堂,听说是黑马的王牌项目,用的是 @RequiredArgsConstructor 注解,现在又用这个了。
4
别再手写判空了!SpringBoot 自带的 20 个高效工具类
16
记录一下Spring的一个小玩意:response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); 写文件下载或导出Excel的场景可以用一下,不用自己再去写枚举啥的。
3
有没有懂哥讲一讲这是什么套路? 刚刚接了一个电话,问我是不是在找工作,准确说出我的姓名,学校工作经历等等,我很好奇这些东西怎么泄漏出去的,于是就配合她的提问,她的意思就是说去他们公司培训,培训不收费,然后学一段时间,可以帮助模拟面试,简历优化等等服务,然后内推一些公司,如果就业成功的话要给公司交2w块钱,质保两年。意思就是两年内被开了怎么样,后续服务不收费。我想请教一下家人们,这玩意靠谱吗🧐哦对了,他们是在boss这种招聘软件开的一些岗位让你投简历,然后拿到你的信息的。
1
今天面了一家,这种情况还真被我碰到了。。。 boss写着小程序开发,杭州,5-8k,五险不含一金。 老板35-40岁女的,桌上放了个好大的lv包包,手上的金戒指被灯光照的一闪一闪的,脸部的粉底很白和脖子颜色鲜明对比,还有点卡粉,咳咳扯远了。 自我介绍,学校经历,工作经历介绍完了后,她把她的好像叫华为RS非凡大师那一款手机,打开了一个小程序,说按照这个差不多的来做,业务是小区停车位的销售和租用服务,包括其他的比如积分抵换租用时常等等。然后后端,前端,小程序上架一条龙让我一个做,问我多大把握。我一听(卧槽,这回遇到真全栈了),我问她为啥不着外包公司做,一个人做一点不现实(何况就开这么点工资…),她说什么我忘了,给我感觉就是想省钱。我说做不了然后就走了😅
3
下载 APP