您的位置:首页 > 编程语言 > Java开发

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

2017-07-17 00:00 525 查看
摘要: Java自动装箱和拆箱,包装类缓存机制和JVM调节

关于Java自动装箱和拆箱

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

自动装箱,个人感觉也就是为了所谓的java泛型,泛型就是一种糖,装箱是一种糖也就更好解释了。并且两者都是编译器提供的,都存在于编译期(当然编译器做的越多,JVM就可以解释的越快),我想通过反编译,可以轻松的发现。

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

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

基本类型防迷惑

基本类型不管多大,==都返回true,因为基本类型不会比较地址,更不存在equals

包装类所提供的缓存机制

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



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



关于包装类的equals



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

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



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



再看一下valueOf的源码,就会发现如果值在-128—127,会直接从cache(就是一个数组,在XXXCache私有静态内部类中)中取。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA