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
    如果喜欢我的文章,可关注我的公众号哦

  • 相关阅读:
    AcWing 1135. 新年好 图论 枚举
    uva 10196 将军 模拟
    LeetCode 120. 三角形最小路径和 dp
    LeetCode 350. 两个数组的交集 II 哈希
    LeetCode 174. 地下城游戏 dp
    LeetCode 面试题 16.11.. 跳水板 模拟
    LeetCode 112. 路径总和 递归 树的遍历
    AcWing 1129. 热浪 spfa
    Thymeleaf Javascript 取值
    Thymeleaf Javascript 取值
  • 原文地址:https://www.cnblogs.com/xujingyang/p/6609584.html
Copyright © 2011-2022 走看看