ArrayList 这是真李逵还是假李逵?

                                                                                         先小声逼逼

  总所周知,在日常功能开发中,ArrayList是我们常用到的一个集合类,既然是经常用到,那么你应该早就踩过很多的坑了,说不定你也早就练就了一副bug在手,天下我有的心态,我想现在你解决掉每一个坑的表情也许会是这样的

                                                           

但是牛逼归牛逼,我相信遇到问题如果你不仔细推敲并记录在小本本上的话,那么日后的你的表情也许就是这样的了

                                                                    

如果避免上面那种尴尬而又不失礼貌的情况呢,接下来就让我徐某人带领你们一块复盘下ArrayList比较经典的两个问题,music~

案列一

  记得那是一个阳光明媚的下午,徐某人刚好改完手头上的代码,屁颠且悠闲的泡了一杯西湖龙井,敲着二郎腿,哼着小曲,正准备打开手机看看之前投的股票行情,结果同事小刘跑过来跟我说,“徐哥,你前天提交的bug fix版本有问题,客户那边打电话过来说新添加的人员又下发失败了”,听到这话,徐某人差点从椅子上摔下来。。。

                                                                

喝了口龙井,平复了心情,开始徐某人的骚操作之路。

首先第一个想到的是数据库人员表数据是否和设备一致,利用娴熟idea快捷键,迅速定位到了对应的执行sql,把sql拷贝出来放在可视化工具中执行一看,我特么,数据库人员也是对的,客户刚下发的人员也在!!!

紧接着,徐某人又去给客户的交付的验收包中,用BeyondCompare工具对比了版本号,发现也没有问题,然后call 来了设备端的小哥哥,调出了人脸设备上的系统日志,这里可能有小伙伴要问了,为什么你还要去查看设备上的系统日志?是这样,我们的同步人员走的是Rabbit MQ消息,也就是说人员的新增、修改、删除都是基于指令来完成的,设备端需要接收到下发指令才能同步人员,看设备日志目的要排查下消息指令有没有正确下发成功,好确定下一步问题排查的方向

从这里可以看到我们的同步指令已经下发给了设备,并且设备也消费掉了,按照道理,人员应该同步了才是啊。

                                                                                 

看到这里,你是否以为我徐某人黔驴技穷了?NO,接下来徐某人开始了艰难而又苦逼的远程debug之路(idea远程断点方法百度上有很多吗,这里就不说了)

首先我们根据请求URL地址,从Controller一路定位到具体的ServiceImpl层,然后找到对应的handle类,因为同步人员代码篇幅过长,这里只是列出核心的代码片段

2783行发现,从数据库中获取的数据情况和数据库中人员数量是一致的,这里看到,取出的条数为5条(数组索引从0开始),接着按下 F6 一直到2785行(什么,你怎么不直接在2785行设置断点),我们寻找问题要一步一个脚印,把可能出现问题的地方都考虑到了,这样才能事半功倍,快速定位问题

什么? 怎么经过asList函数后,数量变成1了,这与我们预想的完全对不上啊,不慌,我们点进去这个函数,看看里面的源码实现是这样的

意思翻译下来大概是这样的 "充当基于数组的API和基于集合的API之间的桥梁", 这句话怎么理解呢,我们祭出java大杀器 - MaTools

看到这段有的小伙伴应该就明白了,这里应该传的是数组中对象的类,什么时间数组中对象的类呢,简单的说就是包类型和字符串类型,接着我们再来看下源码

这里size()函数最终返回的是数组的length,为了验证基础数据类型数组和包类型数组的.length到底有什么区别,我这里简单的写个个单元测试类来验证下

结果如下,可以看出基础数据类型的长度得到是1,而包类型的数据长度得到的才是5

既然发现了问题所在,解决问题也就是手到擒来的事儿了

                                                               

这里给出2种解决办法:

1. 我们知道了这个Array.asList其实并不是真正使用的java.util.ArrayList,只是Arrays里面的一个静态内部类,所以我们只要在刚才的地方套上一层new ArrayList()就可以了;

2.将对应的基数数据类型数组替换成包对象类型数组;

总结

  在项目中使用ArrayList或者是其他数据结构时,一定要对使用的数据结构有一定的了解和掌握,弄清每种数据结构的优点和劣势,其所使用的场景,空间和时间的复杂度等等,要了解每种数据结构里面所定义的方法代表的含义和缺陷,避免李鬼和李逵问题发生,这样才能在使用过程中做到动态调整和灵活应对。

思考

假设我有个需求是这样的,请问会产生什么结果?为什么会产生这样的结果?你的解决办法是什么?

  知道答案的看官请给我留言,我将下一期带大家一起探讨Array 和 ArrayList傻傻分不清楚问题,原创不易,请点赞关注,如需转载,请注明出处,再次感谢各位看官耐心看完,高山仰止,景行行止,我们下期再见~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值