Java自动装箱实战

自动装箱

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

实例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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值