java自动装箱优先_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没有,也就没有==比较的有趣现象了。

b41606dc9193d2b84951e9cf877020db.png

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

2fbaf4364aa877e1724d057198df8c69.png

关于包装类的equals

5d581b7a324cac7f57b60d20ea6bf74e.png

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

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

11bf25fe76d6854ccd4ec48e0ed335f6.png

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

78c9d7e699da9fb87c914f5aae291377.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值