IDEA告警:Unnecessary unboxing ‘xxx.intValue()‘

简介: 显式编码拆箱已包装的原始数值。在Java5及以上的版本,拆箱是不必要的,可以安全地删除。那么 JDK5 到底做了啥

5.png

显式编码拆箱已包装的原始数值。在Java5及以上的版本,拆箱是不必要的,可以安全地删除。那么 JDK5 到底做了啥?


自动装箱(auto-boxing)与自动拆箱(auto-unboxing)


Java语言的基本类型都有包装(wrapper)类型。需要包装类型,是因为许多Java核心类库的API都是面向对象。如Java的容器类,就只支持引用类型。当需要一个能存储数值的容器类时,往往定义一个存储包装类对象的容器。


对基本类型的数值,需先将其转换为对应包装类,再存入容器。在Java程序中,这个转换可显式,也可隐式,后者即Java的自动装箱。

7.png



构造一个Integer类型ArrayList,向其中添加一个int值0。然后,获取该ArrayList的第0个元素,并作为int值返回,对应字节码:

6.png



当向泛型参数为Integer的ArrayList添加int值时,便用到自动装箱。字节码偏移量为10的指令,调用了Integer.valueOf,将int类型的值转换为Integer,再存储至容器类。


public static Integer valueOf(int i) {

   if (i >= IntegerCache.low && i <= IntegerCache.high)

       return IntegerCache.cache[i + (-IntegerCache.low)];

   return new Integer(i);

}


当请求的int值在某个范围内时,会返回缓存的Integer对象;在范围之外时,新建Integer对象。


参数java.lang.Integer.IntegerCache.high影响这里的IntegerCache.high。可配置该参数,扩大Integer缓存的范围。Java虚拟机参数**-XX:+AggressiveOpts**也会将IntegerCache.high调整至20000。


Java并不支持对IntegerCache.low的更改,对小于-128的整数,无法直接使用由Java核心类库所缓存的Integer对象。


25: invokevirtual java/lang/Integer.intValue:()I


当从泛型参数为Integer的ArrayList取出元素时,我们得到的实际上也是Integer对象。如果应用程序期待的是一个int值,那么就会发生自动拆箱,对应字节码偏移量为25的指令,调用Integer.intValue,直接返回Integer对象所存储的int值。

目录
相关文章
IDEA告警详解:Optional.isPresent can be replaced with functional-style expression
类似 if(Optional.isPresent()) 的条件语句,可以被重写成函数式风格。
205 0
IDEA告警详解:Optional.isPresent can be replaced with functional-style expression
|
缓存 Java Maven
IDEA 告警:Library source does not match the bytecode for class
IDEA 告警:Library source does not match the bytecode for class
1763 0
IDEA 告警:Library source does not match the bytecode for class
取消IDEA的Autowired对字段注解告警
取消IDEA的Autowired对字段注解告警
233 0
取消IDEA的Autowired对字段注解告警
|
API
IDEA告警:Can be replaced with ‘.values().stream()‘
IDEA告警:Can be replaced with ‘.values().stream()‘
577 0
IDEA告警:Can be replaced with ‘.values().stream()‘
|
存储
IDEA 告警Unpredictable ‘new BigDecimal()‘ call
IDEA 告警Unpredictable ‘new BigDecimal()‘ call
461 0
|
API
IDEA 告警:Stream API call chain can be simplified
IDEA 告警:Stream API call chain can be simplified
329 0
IDEA告警:Field can be converted to a local varible
IDEA告警:Field can be converted to a local varible
666 0
|
11月前
|
Java 应用服务中间件 Maven
在IntelliJ IDEA中如何配置使用Maven以创建Tomcat环境
所以,别担心这些工具看起来有些吓人,实际上这些都是为了帮助你更好的完成工作的工具,就像超市里的各种烹饪工具一样,尽管它们看起来可能很复杂,但只要你学会用,它们会为你烹饪出一道道美妙的食物。这就是学习新技能的乐趣,让我们一起享受这个过程,攀登知识的高峰!
719 27
|
11月前
|
Java 应用服务中间件 Apache
在IntelliJ IDEA中使用Maven配置Tomcat环境
此配置方法具有较高的实用性,简单易懂。遵循以上步骤,您将能顺利在IntelliJ IDEA中使用Maven配置Tomcat环境,从而进行Web项目的开发和调试。
1383 18
|
IDE 程序员 开发工具
只用正版!教你5个方法,白嫖JetBrains家族的所有产品,包含:IntelliJ IDEA、PyCharm、WebStorm、CLion、Rider
程序员晚枫分享了5种官方认证的免费使用JetBrains家族产品的方法,包括内容创作者计划、开源项目支持、教育许可证、用户组支持和开发者认可计划。这些方法帮助个人开发者与小型团队合法获取强大开发工具,如IntelliJ IDEA、PyCharm等,降低开发成本,提升效率。同时提醒大家遵守使用规范,尊重知识产权。
2325 13