Java自动装箱实战

博客主要围绕自动装箱展开,给出两个实例。实例1是int转Integer,优化后执行时间从5.8秒左右降至3.5秒,原因与Integer常量池范围有关;实例2涉及Long和long,原代码因sum为Long导致多次自动装箱,需调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动装箱

因为本篇为自我学习用,不会讲解过多基础概念。

实例1:int转Integer

package JVMTest;

import java.lang.reflect.Method;

public class TestAutoBoxing {
	public static void target(int i) {
		// 空方法
	}

	public static void main(String[] args) throws Exception {
		Class<?> klass = Class.forName("JVMTest.Test");
		Method method = klass.getMethod("target", int.class);

		long current = System.currentTimeMillis();

		for (int i = 1; i <= 2_000_000_000; i++) {
			if (i % 100_000_000 == 0) {

			}


			method.invoke(null, 128); 
		}
		System.out.println(System.currentTimeMillis() - current);
	}
}

以上代码执行平均在5.8秒左右,更改以下代码


	final static Integer a = 128;//新增全局常量


。。。。。。。。。。。
	method.invoke(null, a); //替换int128

优化后执行为3.5秒左右,原因为128不在Integer常量池内(范围[-128-127]),虚拟机每次执行需转化为Integer对象。PS:也可添加-Djava.lang.IntegerCache.high=128运行参数

实例2: Long和long

private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}

之所以用long 类型,因为 int 类型不足以保存所有正整数的总和,然而以上代码却忽略的一点,sum为Long,这就导致了2^31次自动装箱,非常致命。只需做如下调整:

long sum = 0L;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值