当前位置: 首页 > 后端技术 > Java

通过源码了解Java的自动装箱和拆箱

时间:2023-04-02 00:16:34 Java

什么是装箱和拆箱?将int原始类型转换为Integer包装类型的过程称为装箱,反之称为拆箱。先看一段代码publicstaticvoidmain(String[]args){Integera=127,b=127;整数c=128,d=128;System.out.println(a==b);//真正的系统。out.println(c==d);//false}不知道还有没有人不知道这段代码为什么会出现真假。由此引出Java装箱的操作。我们带着问题分析。装箱(valueOf())publicstaticIntegervalueOf(inti){//-128-127if(i>=IntegerCache.low&&i<=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}我们可以发现最开始有个判断,如果这个值的范围是在[-128,127]之间,那么就从这个缓存中取出(Integer数组),如果不是,范围是然后直接新建一个。为什么会有[-128,127]的缓存?我说的是理解,因为在我们的业务中,可能存在各种状态、标识等Integer类型的字段。这些值一般是0、1、2、3之类的,而且出现的频率很高。如果没有Cache,那么就需要频繁new对象,然后释放,这样会消耗大量的内存空间,所以这个cache的出现,可以极大的帮助我们优化一些空间的浪费。为什么是[-128,127]?这个我看了一下,这里就不细说原因了。主要靠计算机基础知识。明白什么是原码、反码、补码后。很容易看出为什么它在这个范围内。这个值也可以通过启动参数改变。-XX:AutoBoxCacheMax=(size)自动装箱带来的性能问题现在你应该明白上面代码结果不同的原因了,那你有没有想过,比如我们业务中的一个for循环中,有这样的统计操作,如果有自动装箱,会出什么问题?让我们看看下面的一段代码。publicstaticvoidmain(String[]args){longstartTime=System.currentTimeMillis();整数计数=0;//整数计数=0;对于(inti=0;i<5000000;i++){count+=i;}System.out.println("计算时间:"+(System.currentTimeMillis()-startTime)+"ms");}//执行结果://整数计算时间:51ms//int计算时间:6ms然后通过执行结果可以很明显的发现,新对象频繁的自动装箱和内存分配造成了时空性能的损失。总结通过上面的源码阅读和测试分析,我们可以得出一个结论,我们在平时进行统计或者给方法添加参数的时候,应该尽量避免这种类型转换的问题。来提高我们整个代码的执行效率。拆箱(intValue)拆箱没有复杂的逻辑,直接返回值的基本类型。

最新推荐
猜你喜欢