Java自动装箱和拆箱,包装类缓存机制和JVM调节

关于Java自动装箱和拆箱

基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能java

自动装箱,我的感受也就是为了所谓的java泛型,泛型就是一种糖,装箱是一种糖也就更好解释了。而且二者都是编译器提供的,都存在于编译期(固然编译器作的越多,JVM就能够解释的越快),我想经过反编译,能够轻松的发现。算法

自动装箱:把基本类型用它们对应的引用类型包装起来,使它们具备对象的特质 Integer a=3(Integer源码,注释的信息量很大啊( ̄ ̄)")数组

自动拆箱:将Integer及Double这样的引用类型的对象从新简化为基本类型的数据 int i = new Integer(2)缓存

基本类型防迷惑

基本类型无论多大,==都返回true,由于基本类型不会比较地址,更不存在equals优化

包装类所提供的缓存机制

每一个整形的包装类,包括Long、Integer、Short、Byte、Character,都提供了缓存机制(一种优化手段),可是Float、Double没有,也就没有==比较的有趣现象了。spa

调整JVM参数-XX:AutoBoxCacheMax=250,最大缓存值能够达到-128—250 ,只能调整上限,这和Integer缓存算法实现有关,固然这个参数只对Integer有效,Long...没法调节,经过源码能够清楚的看到这一点。对象

关于包装类的equals编译器

关于==,说-128—127存在所谓的常量池由于缓存就是一个静态数组,能够认为存在常量池),不如说是整形包装类停供的缓存机制,由于当-128—127是从缓存(xxxCache数组)中取。源码

每个整形包装类里面都有一个,私有静态内部类XXXCache,里面含有对应类型的固定长度(其实经过JVM参数能够调节)的final cache数组 。见下面源码(注意注释):it

再看一下Long的(很简单):

再看一下valueOf的源码,就会发现若是值在-128—127,会直接从cache(就是一个数组,在XXXCache私有静态内部类中)中取。

相关文章
相关标签/搜索