zoukankan      html  css  js  c++  java
  • 关于jdk1.5之后的自定拆装箱

    我们都知道jdk在1.5版本之后,增加了一些新特性,我们称之为语法糖,有:1、泛型,2、foreach增强for循环,3、自动拆装箱,4、可变参数,5、枚举,6、静态导入

     1 public class TestMain
     2 {
     3     public static void main(String[] args)
     4     {
     5         Integer i = 10;
     6     }
     7 }
     8 
     9 
    10 public class TestMain
    11 {
    12     public static void main(String[] args)
    13     {
    14         Integer integer = 10;
    15         int i = integer;
    16     }
    17 }

    通过命令行程序,进入CLASSPATH(也就是bin目录下.class文件所在的路径),javap反编译查看一下生成的字节码:

    反编译出来的内容有很多,我们只关注重点部分:

     1 public static void main(java.lang.String[]);
     2     flags: ACC_PUBLIC, ACC_STATIC
     3     Code:
     4       stack=1, locals=3, args_size=1
     5          0: iconst_1
     6          1: invokestatic  #16                 // Method java/lang/Integer.valueO
     7 f:(I)Ljava/lang/Integer;
     8          4: astore_1
     9          5: aload_1
    10          6: invokevirtual #22                 // Method java/lang/Integer.intVal
    11 ue:()I
    12          9: istore_2
    13         10: return

    看到在自动装箱的时候,也就是第6行,Java虚拟机会自动调用Integer的valueOf方法;在自动拆箱的时候,也就是第10行,Java虚拟机会自动调用Integer的intValue方法。这就是自动拆箱和自动装箱的原理。

    看一下下面一个神奇的现象

     1 package com.xujingyang.test;
     2 
     3 public class Test2 {
     4     public static void main(String[] args) {
     5         Integer i1 = 100;
     6         Integer i2 = 100;
     7         Integer i3 = 200;
     8         Integer i4 = 200;
     9         
    10         System.out.println(i1 == i2);
    11         System.out.println(i3 == i4);
    12         
    13     }
    14 }

    结果:

    神奇不神奇,为啥呢?产生这样的结果的原因是:Byte、Short、Integer、Long、Char这几个装箱类的valueOf()方法是以128位分界线做了缓存的,假如是128以下且-128以上的值是会取缓存里面的引用的,以Integer为例,其valueOf(int i)的源代码为:

    1 public static Integer valueOf(int i) {
    2     final int offset = 128;
    3     if (i >= -128 && i <= 127) { // must cache 
    4         return IntegerCache.cache[i + offset];
    5     }
    6         return new Integer(i);
    7     }

    而Float、Double则不会,原因也很简单,因为byte、Short、integer、long、char在某个范围内的整数个数是有限的,但是float、double这两个浮点数却不是。关于这个小知识点,个人提出两点意见:

    1、不重要,除了面试考察求职者对于知识的掌握程度,没多大用

    2、要有缓存这个概念,缓存对于提高程序运行效率、节省内存空间是有很大帮助的

     

     

    参考这篇博文:http://www.cnblogs.com/xrq730/p/4869065.html


    作者:oldmonk
    出处:www.jingyangxu.cn
    作者简介:oldmonk,俗称:老徐。
    请记住:你比他好一点,他不会承认你,反而会嫉妒你,只有你比他好很多,他才会承认你,然后还会很崇拜你,所以要做,就一定要比别人做得好很多!
    我的个人微信号:dongfengyang ,欢迎大家找我聊天,记录你我的故事。

    本文如对您有帮助,记得点击右边跳动小球【赞一下】 n(*≧▽≦*)n
    如果喜欢我的文章,可关注我的公众号哦

  • 相关阅读:
    747. Largest Number Greater Than Twice of Others 最大数量大于其他两倍
    Python代码规范和命名规范
    Pycharm2018中DataBase的使用
    Pycharm新建文件css文件无后缀,html中无法正确引入
    Pycharm DataBase Navigator Plugins 使用
    Python怎么去写单元测试用例去测试hello world呢
    最近的电视剧推荐
    RobotFrameWork基本语法练习
    RobotFrameWork中使用自定义关键字
    Windows下同时安装了Python2与Python3时如何使用RobotFrameWork
  • 原文地址:https://www.cnblogs.com/xujingyang/p/6609584.html
Copyright © 2011-2022 走看看