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

 public class TestMain
{
public static void main(String[] args)
{
Integer i = 10;
}
} public class TestMain
{
public static void main(String[] args)
{
Integer integer = 10;
int i = integer;
}
}

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

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

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

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

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

 package com.xujingyang.test;

 public class Test2 {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200; System.out.println(i1 == i2);
System.out.println(i3 == i4); }
}

结果:

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

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

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

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

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

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

关于jdk1.5之后的自定拆装箱的更多相关文章

  1. 静态导入方法即自动拆装箱(java)

    package example6;import static java.lang.System.out;import static java.util.Arrays.sort;import java. ...

  2. 黑马程序员_Java基础:JDK1.5后的新特性:自动拆装箱,以及注意事项

    ------- android培训.java培训.期待与您交流! ---------- 首先来看一段代码: Integer x = new Integer(4); Integer y = 4; 在JD ...

  3. Java枚举、静态导入、自动拆装箱、增强for循环、可变参数

    一.枚举简介 1.什么是枚举? 需要在一定范围内取值,这个值只能是这个范围内中的任意一个 现实场景:交通信号灯,有三种颜色,但是每次只能亮三种颜色里面的任意一个 2.使用一个关键字 enum enum ...

  4. Java数据类型和自动拆装箱

    1.java的数据类型:基本数据类型(8种)和引用数据类型. 基本数据类型: 类型 boolean byte short char int long float double 位 1 8 16 16 ...

  5. Integer缓存机制-基本数据类型和包装类型-自动拆装箱

    Integer缓存机制 总结: 1.jdk1.5对Integer新增了缓存机制,范围在-128-127(这个范围的整数值使用频率最高)内的自动装箱返回的是缓存对象,不会new新的对象,所以只要在缓存范 ...

  6. Java基础进阶:APi使用,Math,Arrarys,Objects工具类,自动拆装箱,字符串与基本数据类型互转,递归算法源码,冒泡排序源码实现,快排实现源码,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    要点摘要 Math: 类中么有构造方法,内部方法是静态的,可以直接类名.方式调用 常用: Math.abs(int a):返回参数绝对值 Math.ceil(double a):返回大于或等于参数的最 ...

  7. Integer的缓存和自动拆装箱

    先看一个简单的例子: public class TestInteger { public static void main(String[] args) { System.out.println(&q ...

  8. JDK5-自动拆装箱

    拆装箱:在基本类型与其对应的引用类型之间转换 装箱:Integer iObj = 5; 拆箱:int i = 5 + iObj; 装箱时,一个字节以内的数据在一个常量池中(小整数的使用频率高),即-1 ...

  9. 《java入门第一季》之Integer类和自动拆装箱概述

    / * int 仅仅是一个基本类型.int有对应的类类型,那就是Integer.  * 为了对基本数据类型进行更多的操作,更方便的操作,Java就针对每一种基本数据类型提供了对应的类类型--包装类类型 ...

随机推荐

  1. Tomcat翻译--Context Container

    原文:http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Resource_Definitions The Context Cont ...

  2. Java_脚本引擎_00_资源帖

    一.精选资料 1.w3cschool—Java 脚本引擎 2.Riding the Nashorn 二.参考资料

  3. Mac 系统安装redis服务

    1.首先去http://www.redis.io/下载最新的redis文件,现在最新的是redis-2.8.19 2.进行解压缩 tar -zxvf redis-2.8.19.tar.gz 3.移动重 ...

  4. brew安装php和扩展

    brew install homebrew/php/php56 --with-apache 报错: checking if the location of ZLIB install directory ...

  5. [转]C++ 智能指针详解

    转自:http://blog.csdn.net/xt_xiaotian/article/details/5714477 C++ 智能指针详解 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每 ...

  6. 使用PHP配置文件

    /**************************************************************************************** * 使用PHP配置文 ...

  7. PostgreSQL学习手册 性能提升技巧

    http://www.cnblogs.com/mchina/archive/2012/08/11/2537393.html 一.使用EXPLAIN:    PostgreSQL为每个查询都生成一个查询 ...

  8. ajax返回

    1.几种方式public function getAjax(){ //$data = 'ok'; //$this->ajaxReturn($data); // 'ok' //$this-> ...

  9. Unity之将Texture保存成png

    http://blog.csdn.net/bingheliefeng/article/details/51177505 using UnityEngine;using System.Collectio ...

  10. 学习动态性能表(13)--v$open_cursor

    学习动态性能表 第13篇--V$OPEN_CURSOR  2007.6.8 本视图列出session打开的所有cursors,很多时候都将被用到,比如:你可以通过它查看各个session打开的curs ...