You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ArrayList.get()方法在if条件中的异常行为及原因咨询

ArrayList元素比较不符合预期的原因及get()方法注意事项

问题原因分析

你遇到的问题核心是ArrayList中存储的是Integer包装类型,而非int基本类型:

  • Java中,!=用于对象比较时,判断的是两个对象的内存引用是否相同,而非值是否相等。
  • Java对Integer类型有缓存机制:Integer.valueOf()会缓存-128到127之间的数值,这个范围内的相同数值会复用同一个对象;但数值超过127(比如你的151)时,每次都会创建新的Integer对象。
  • 你的arr.get(0)和arr.get(1)是两个不同的Integer对象,因此arr.get(0)!= arr.get(1)会判断为true,触发返回逻辑。
  • 当你强制转为int时,会触发自动拆箱操作,把Integer转成基本类型int,此时!=比较的是数值大小,151和151相等,条件变为false,不会进入分支。

ArrayList.get()方法的注意事项

  • 包装类型与基本类型的区别:如果集合中存的是包装类型(如Integer、Long),比较值时优先用equals()方法,或者拆箱为基本类型后用==/!=,避免引用比较导致的逻辑错误。
  • 索引合法性检查:调用get(int index)时,index必须满足0 ≤ index < list.size(),否则会抛出IndexOutOfBoundsException,建议在调用前先判断索引范围,或者结合size()方法做边界处理。
  • null值处理:如果集合允许存储null,get()可能返回null,后续对该值调用方法时要先判空,避免NullPointerException。
  • 并发场景风险:ArrayList不是线程安全的集合,在多线程读写的场景下,get()可能获取到不一致的数据,需要通过同步锁或者改用线程安全集合(如CopyOnWriteArrayList)来处理。
  • 遍历性能优化:虽然get()是O(1)操作,但在循环遍历集合时,若频繁调用get(),可以考虑先将元素暂存到局部变量中,减少方法调用开销(尤其在大规模集合遍历场景下)。

内容的提问来源于stack exchange,提问作者Pankaj Patidar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:43:18