自动装箱
因为本篇为自我学习用,不会讲解过多基础概念。
实例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;