int和Integer缓存的实现是怎样的
今天就跟大家聊聊有关int和Integer缓存的实现是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
int相信我们都很熟悉吧,Java中的原始数据类型,同为原始数据类型的还有long、short、float、double、char、byte、boolean。原始数据类型不是对象。
Integer是int对应的包装类,其中有一个private final int value;来存储数据,并且还提供了一些基本操作,例如sum、max、int和字符串的转换等方法。从value声明为private final可以得知它也是一个不可变类型!
在Java5中引入了自动装箱和自动拆箱功能,也就是Java可以根据上下文自动将int转为Integer或Integer转为int。自动装箱、拆箱其实算一种语法糖(语法糖就是对现有语法的一个封装,主要是为了方便程序员的开发,提高开发效率)。
在编译阶段发生,由javac来帮我们自动装箱、拆箱。具体是调用Integer.valueOf方法来进行装箱,调用Integer.intValue方法来进行拆箱。我们来反编译下看看是不是这样,例如以下代码
反编译结果,确实是这样!
我们再来说说这个valueOf方法,构建Integer对象的传统方式是直接调用构造器new一个对象,但是根据实践发现大部分的数据操作都集中在值比较小的范围,所以Java5中又引入了静态工厂方法valueOf,调用它时会利用IntegerCache,也就是一个缓存,能带来明显的性能改进。默认的缓存值是-128到127。
什么意思呢?先看一下源码
如果没有修改默认缓存值(-128到127)的话,我们执行Integer i = 一个值(注意不是直接new Integer,直接new是不会利用缓存的),这个值如果大于等于-128,小于等于127,是不会new一个新的Integer对象而是去IntegerCache去找到这个缓存对象的引用直接返回。这样我们常用的一些值就能直接用缓存了!减少了消耗!
如果明确知道常用的整型的值更大一些那也是可以修改默认缓存值的。
通过设置JVM -XX:AutoBoxCacheMax=
再来看看IntegerCache都干了啥
很简单吧,就是弄了个Integer数组,在静态代码块内去读看看我们有没有设-XX:AutoBoxCacheMax=
还有一点要注意:避免无意中的装箱和拆箱,特别是在性能敏感的场合,因为创建大量的对象和大量的整数,无论是从内存角度还是处理速度上开销不是一个数量级的。所以在性能敏感的场合尽量使用原始数据类型。
看完上述内容,你们对int和Integer缓存的实现是怎样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。