先小声逼逼

总所周知,在日常功能开发中,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傻傻分不清楚问题,原创不易,请点赞关注,如需转载,请注明出处,再次感谢各位看官耐心看完,高山仰止,景行行止,我们下期再见~~

ArrayList 这是真李逵还是假李逵?相关推荐

  1. 真降价还是假环保?华为客服回应手机取消充电器:不清楚

    昨日,网传华为部分手机取消充电器,降价200元.至于为何要实行这一举措,有接近华为业内的人士称,不仅手机芯片严重不足,充电IC芯片也大规模缺货,所以无奈加入不送充电器和数据线阵营. 不过就在昨晚,有华 ...

  2. if(-1)为真还是假_女人是“真拒绝”还是“假矜持”,其实一眼就能看出来

    正所谓"女人心海底针",在有着直线思维的男人眼里,女人的心思是世界上最难猜透的,要想知道她到底在想什么,不光看表面意思,更要懂得她的言外之意. 就拿你送礼物来说,虽然她表面上说&q ...

  3. 【数理逻辑】谓词逻辑 ( 判断一阶谓词逻辑公式真假 | 解释 | 示例 | 谓词逻辑公式类型 | 永真式 | 永假式 | 可满足式 | 等值式 )

    文章目录 一. 判断谓词逻辑公式真假 ( 语义 ) 二. 谓词逻辑 "解释" 三. 谓词逻辑 "解释" 示例 四. 谓词逻辑公式类型 一. 判断谓词逻辑公式真假 ...

  4. 计算营业额python代码_真香还是假香,Python处理分析128张Excel表格竟然不到3秒?| 附案例数据集...

    原标题:真香还是假香,Python处理分析128张Excel表格竟然不到3秒?| 附案例数据集 作者:吹牛Z 本文转自公众号:数据不吹牛 更新完Pandas基础教程,后台有不少旁友留言,想要了解怎么用 ...

  5. 混淆矩阵、召回率、精确率、正确率、F1、真阳性率、假阳性率、ROC、AUC

    ConfusionMatrix:Confusion Matrix:ConfusionMatrix: 真实 1 0 预测 1 TP(命中) FP(虚报) 0 FN(漏报) TN(正确拒绝) 召回率Rec ...

  6. 4k分辨率是多少(真4k与假4k区别)

    4K电视分辨率达到3840×2160像素,是2K电视的两倍,清晰度不用说,带来的视觉体验更上一层楼. 然而,很多用户可能不知道,4K电视的面板有真有假,你买的电视可能是个假4K. 液晶电视屏幕面板上, ...

  7. 聊一聊 MYSQL 数据的真删和假删

    前言 简单做个小白文描述. 真删 : 指的就是 彻底地删除, 从数据库表内将数据 进行 移除  delete . 假删: 指的就是 逻辑上的删除 , 数据库表内, 数据会包含一个标识flag字段 , ...

  8. 测试电视是不是4k的软件,如何检测自家的电视是真4K还是假4K?当贝市场告诉你...

    如今电视市场,4K电视"遍地开花",但是你真的知道什么是4K电视吗? 首先,4K是指具备4K分辨率的显示器设备,它是具有3840*2160分辨率的超精细画面.相对于主流的1080P ...

  9. win8 激活历程 真激活与假激活

    这个实在是没什么好说的了. 首先说说装win8吧,装完后,随便找了个激活软件 激活了下,结果异常顺利,并没有出现什么异常,心中不禁窃喜啊:结果刚玩没多久发现个性化里面所有的功能全是灰色禁用的 无语了, ...

最新文章

  1. 一份关于kaggle特征构建技巧和心得
  2. log4net使用详解 .
  3. Android之startService与bindService的区别
  4. dncnn图像去噪_一种基于DnCNNs改进的图像降噪方法与流程
  5. 京东抢购助手_[Windows] 京东极速抢购助手V2.0,支持京东健康+扫货抢购
  6. plsql 快捷键设置
  7. VCL组件之主要方法(Methods)和通用事件(Events)
  8. DELL服务器常见报错信息
  9. Vue 组件库 (一)
  10. 修改linux的防火墙
  11. 工业控制系统(ICS)
  12. 微信小程序 实现简单倒计时功能
  13. Python自省机制
  14. 将机器人的urdf文件转为Mujoco模型
  15. 二进制乘除法运算原理
  16. debian 7 调整控制台分辨率
  17. 什么是SaaS系统,SaaS系统有哪些优势
  18. matlab光子晶体求反射率,一维光子晶体禁带结构的MATLAB分析计算讲解.PDF
  19. 折叠屏市场起风,华为、OPPO“你追我赶”
  20. Linux永久删除文件恢复

热门文章

  1. 怎么自己做markdown目录?
  2. post office 问题
  3. 算法性能分析(6):代码的内存消耗
  4. 你该不会还不知道吧——免费资源蓝桥杯单片机组完全版信息总结
  5. 仿”知乎“网站用到的表
  6. 吴恩达机器学习lab C1_W1_Lab01_Python_Jupyter_Soln
  7. 解决Ubuntu虚拟机不能复制粘贴
  8. 借助国内ChatGPT平替+剪映/百度AIGC平台快速制作短视频
  9. 读书|《新品类》读后感想
  10. JcJc错别字纠错检查API说明