什么叫装箱 & 拆箱?
将 int 根本类型转换为 Integer 包装类型的过程叫做装箱,反之叫拆箱。
首先看一段代码
public static void main(String[] args) {
Integer a = 127, b = 127;
Integer c = 128, d= 128;
System.out.println(a == b); // true
System.out.println(c == d); // false
}
不晓得还有没有人不晓得这段代码呈现 true 和 false 的起因。由此咱们引出了 Java 装箱的这个操作。咱们带着疑难去进行剖析。
装箱(valueOf())
public static Integer valueOf(int i) {
// -128 - 127
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
咱们能够发现,在最开始有一个判断,如果这个值的范畴在 [-128,127] 之间,那么就从这个缓存(Integer 数组)中取,如果不在这个范畴那么间接 new 一个。
为什么要有 [-128,127] 的缓存?
我说说的了解,因为在咱们的业务中,可能存在各种状态和标识等 Integer 类型的字段,这些值个别都是 0,1,2,3 之类的,而且呈现的比拟频繁,如果没有缓存,那么就须要频繁的 new 对象,而后再开释,就十分耗费内存空间,所以对于这个缓存就呈现了,能够极大的帮忙咱们优化一些空间上的节约。
为什么是[-128,127]?
这个我看了一下,具体为什么这里就不详说了,次要还是依赖计算机基础知识,在你理解了什么是原码、反码、补码。就很容易晓得为什么是这个范畴区间了。
这个值也是能够通过启动参数进行更改的。
-XX:AutoBoxCacheMax=(size)
主动装箱带来的性能问题
那么看到当初你应该明确下面代码呈现不同后果的起因了,那么你有没有想过,比方咱们业务中一个 for 循环中,呈现了统计数据相似这样的操作,如果存在主动装箱,那么会呈现什么问题?咱们看上面一段代码。
public static void main(String[] args) {long startTime = System.currentTimeMillis();
Integer count = 0;
// int count = 0;
for (int i = 0; i < 5000000; i++) {count += i;}
System.out.println("计算时长:" + (System.currentTimeMillis() - startTime) + "ms");
}
// 执行后果:// Integer 计算时长:51 ms
// int 计算时长:6 ms
那么通过执行后果能够显著的发现主动装箱频繁的 new 对象、分配内存,造成工夫和空间上的性能损耗。
小总结
通过下面的源码浏览和测试剖析,咱们能够得出结论,咱们平时在进行计算统计,或者办法入参的时候,应该尽量的防止这种类型转换的问题。来晋升咱们整个代码的执行效率。
拆箱(intValue)
拆箱总体没有什么简单的逻辑,间接返回这个数值的根本类型。