Integer的拆装箱问题

 

​​​​​

-128127byte的取值范围,如果在这个取值范围内,自动装箱就不会新创建对象,而是从常量池中获取

 * 如果超过了byte取值范围就会再新创建对象

Integer i1 = new Integer(127);

Integer i2 = new Integer(127);

System.out.println(i1 == i2);

System.out.println(i1.equals(i2));

System.out.println("-------------");

 

Integer i3 = new Integer(138);

Integer i4 = new Integer(138);

System.out.println(i3 == i4);

System.out.println(i3.equals(i4));

System.out.println("-------------");

 

Integer i7 = 127;

Integer i8 = 127;

System.out.println(i7 == i8);

System.out.println(i7.equals(i8));

System.out.println("-------------");

 

Integer i9 = 128;

Integer i10 = 128;

System.out.println(i9 == i10);

System.out.println(i9.equals(i10));

 

------------------------------------------------

false

true

-------------

false

true

-------------

true

true

-------------

false

true

 

 

 

 

 

 

 

 

自动拆箱(boxing)和自动装箱是Java语言设计的一个特性,它允许将基本数据类型(如int、char等)隐式转换为对应的包装类对象(如Integer、Character等),反之亦然,以支持方法的引用和操作。如果你遇到自动拆装箱带来的性能问题或者想要控制这种行为,可以采取以下几种策略: 1. **避免频繁拆箱**:尽量减少基本类型和包装类之间的转换,特别是循环中的大量操作。例如,在循环内计算可以直接使用基本类型的值,避免每次迭代都创建新的包装对象。 ```java for (int i : numbers) { // 直接对i进行操作 } ``` 2. **批量拆箱**:如果需要处理大量的基本类型数据,你可以选择一次性将其全部转换为列表或其他集合,然后遍历操作。 ```java List<Integer> integerList = IntStream.of(numbers).boxed().collect(Collectors.toList()); for (Integer num : integerList) { // 使用num } ``` 3. **使用Java 8的Stream API**:对于流(Stream)处理,流内部会自动优化拆箱装箱过程,所以直接使用流可以避免手动管理。 4. **使用`javac`命令的选项**:在编译阶段,你可以通过`-XX:TieredStopAtLevel=1`这样的JVM选项来禁用部分优化级别,包括拆箱,但这可能会导致其他优化效果降低。 5. **自定义枚举**:如果你的业务场景下有固定的有限种可能性,可以考虑使用枚举替代基本类型和包装类,这可以避免自动拆箱。 记得,除非有特定性能需求,一般情况下自动拆箱装箱不会成为性能瓶颈,因为现代 JVM 已经做了很多优化。不过了解其原理并合理使用能帮助你编写更高效、清晰的代码。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值