JDK5以后

Integer a = 3;              这是自动装箱
int     i = new Integer(2); 这是自动拆箱
就是基本类型和其对应的包装类型在需要的时候可以互相转换,具体过程由编译器完成
比如自动装箱:
Integer a=3;
其实编译器调用的是static Integer valueOf(int i)这个方法
查阅JDK知道,
valueOf(int i)返回一个表示指定的int 值的Integer 对象
那么就变成这样: Integer a=3;   =>    Integer a=Integer.valueOf(3);
对应的  int intValue()  返回该Integer对象的int值,是拆箱

我们再来看Integer缓存, 
下面是IntegerCache类的源码
 
Java代码 
private static class IntegerCache   //定义类名 
{   
    static final int high;   
    static final Integer cache[];   //cache缓存是一个存放Integer类型的数组 
 
    static  //初始化 
    {   
        final int low = -128;       //最小值是固定的 
        int h = 127;                //最大值暂时是127 
        if (integerCacheHighPropValue != null) //这段if代码不用深究,是一些判断,我看得眼花啊 
        {   
            int i = Long.decode(integerCacheHighPropValue).intValue();   
            i     = Math.max(i, 127);   
            h     = Math.min(i, Integer.MAX_VALUE - -low);   
        }   
        high = h;  //此时high就是127  
 
        cache = new Integer[(high - low) + 1];  //有256个元素 
        int j = low;                            //j的初始值是-128 
        for(int k = 0; k < cache.length; k++)   //缓存区间数据    
            cache[k] = new Integer(j++);        //将-128~127包装成256个对象存入缓存 
    }   
    private IntegerCache(){}  //构造方法,不需要构造什么 

 
 
再来看valueOf方法
 
Java代码 
public static Integer valueOf(int i)  
{   
    if(i >= -128 && i <= IntegerCache.high) 
    { 
        //如果i在-128~127之间,就直接在缓存中取出i的Integer类型对象 
        return IntegerCache.cache[i + 128];   
    }     
    else 
    { 
        return new Integer(i);  //否则就在堆内存中创建 
    }     
}  
 
 
valueOf方法会自动调用IntegerCache这个类,
IntegerCache初始化后内存中就有Integer缓冲池cache[]了,
-128~127区间的int值有其对应的的包装对象
java使用该机制是为了达到最小化数据输入和输出的目的,这是一种优化措施,提高效率
其他的包装器:
Boolean:(全部缓存)
Byte:    (全部缓存)
 
 
Character (   <=127 缓存)
Short     (-128~127 缓存)
Long      (-128~127 缓存)
 
 
Float     (没有缓存)
Doulbe    (没有缓存)

主题:java迷题:等于,还是不等于?
 
代码片段1
 
public static void main(final String[] args) {  
 
    Integer a = new Integer(100);  
 
    Integer b = 100;  
 
    System.out.println(a == b);   
 
}
 
解答:
 
结果输出false
 
因为new Integer(100)是指明了再堆内存中创建对象
 
而Integer b = 100; 这句是自动装箱,
 
得到的是Integer缓冲池中的对象,是这句代码return IntegerCache.cache[100 + 128]
 
明显a和b的地址是不一样的,不是同一个对象
 
 
 
代码片段2
 
public static void main(final String[] args) {  
 
    Integer a = 100;  
 
    Integer b = 100;  
 
    System.out.println(a == b);   
 
}
 
解答:
 
结果输出true
 
a和b指向了同一个对象,都是IntegerCache.cache[100 + 128]
 
 
 
代码片段3
 
public static void main(final String[] args) {  
 
    Integer a = 156;  
 
    Integer b = 156;  
 
    System.out.println(a == b);   
 
}
 
解答:
 
结果输出false
 
由于156大于128,它的包装对象不在缓冲池中,而是执行return new Integer(156);
 
new了2次,都在堆内存中,但地址不一样
 
 
 
代码片段4
 
public static void main(final String[] args) {  
 
    Integer a = Integer.valueOf(100);  
 
    Integer b = 100;  
 
    System.out.println(a == b);   
 
}
 
解答:
 
结果输出true
 
我们上面说过了,Integer b = 100 就相当于Integer b=Integer.valueOf(100)
 
所以a和b指向缓冲池中的同一对象

【转】Java自动装箱、拆箱、缓冲池的更多相关文章

  1. java自动装箱拆箱总结

    对于java1.5引入的自动装箱拆箱,之前只是知道一点点,最近在看一篇博客时发现自己对自动装箱拆箱这个特性了解的太少了,所以今天研究了下这个特性.以下是结合测试代码进行的总结. 测试代码: int a ...

  2. JAVA自动装箱拆箱与常量池

    java 自动装箱与拆箱 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的 ...

  3. Java 自动装箱/拆箱

    自动装箱/拆箱大大方便了基本类型(8个基本类型)数据和它们包装类的使用 自动装箱 : 基本类型自动转为包装类(int >> Integer) 自动拆箱: 包装类自动转为基本类型(Integ ...

  4. Java自动装箱拆箱

    一.装箱.拆箱定义 如果一个int型量被传递到需要一个Integer对象的地方,那么,编译器将在幕后插入一个对Integer构造方法的调用,这就叫做自动装箱.而如果一个Integer对象被放到需要in ...

  5. 深入理解Java自动装箱拆箱机制

    1.自动装箱与拆箱的定义 装箱就是自动将基本数据类型转换为包装器类型(int-->Integer): 拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int). Java中 ...

  6. 那些年一起踩过的坑 — java 自动装箱拆箱问题

    坑在哪里?   我们都知道Java的八种基本数据类型:int, short, long, double, byte, char, float, boolean   分别有各自对应的包装类型:Integ ...

  7. Java 的自动装箱拆箱

    Java 是面向对象的语言,其基本数据类型也就有了相对应的类,称为包装类.以下是基本数据类型对应的包装类: 基本数据类型 包装类 byte(1字节) Byte short(2字节) Short int ...

  8. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?

    参考:http://blog.csdn.net/mazhimazh/article/details/16799925 1. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法? 原始类型 ...

  9. java基础1.5版后新特性 自动装箱拆箱 Date SimpleDateFormat Calendar.getInstance()获得一个日历对象 抽象不要生成对象 get set add System.arrayCopy()用于集合等的扩容

    8种基本数据类型的8种包装类 byte Byte short Short int Integer long Long float Float double Double char Character ...

  10. Java的自动装箱/拆箱

    概述 自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换.基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类 ...

随机推荐

  1. (转)在SQL中取出字符串中数字部分或在SQL中取出字符部分

    近来在开发一个项目时,一包含数字的字符串,需要取出中间的数字部分进行排序.经过baidu搜索.并结合自己项目的需求,编写了一个自定义的SQL函数用供项目中使用. /****** Object: Use ...

  2. javascript 中的 call

    Javascript中call的使用 Javascript中call的使用自己感觉蛮纠结的,根据文档很好理解,其实很难确定你是否真正的理解. call 方法应用于:Function 对象调用一个对象的 ...

  3. XML解析——Java中XML的四种解析方式

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...

  4. Poj 2840 Big Clock

    1.Link: http://poj.org/problem?id=2840 2.Content: Big Clock Time Limit: 1000MS   Memory Limit: 13107 ...

  5. js设备判断

    判断设备android,weixin,ios var UserAgent=navigator.userAgent.toLowerCase(); var IS_ANDROID=false; var IS ...

  6. 印象笔记无法同步问题解决 Unable to send HTTP request: 12029

    问题 今天突然发现本地软件不能访问网络. 包括: 印象笔记无法同步, 搜狗输入法无法登陆. 但其它上网正常. 思路及解决过程 因为chrome上网 ,qq上网均正常. 且同事可以正常使用. 推测是本地 ...

  7. 隐藏win7盘符

    1.隐藏盘符: //新建注册表,隐藏X盘符 int regeditme() { HKEY hkey; DWORD dwLastError= ;//隐藏X盘2^25 J:2^9=512 X:盘符与挂载的 ...

  8. 单纯形法C++实现

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4156685.html 使用单纯型法来求解线性规划,输入单纯型法的松弛形式,是一个大矩阵,第一 ...

  9. 正文字体大小:大 中 小 解决configure: error: Cannot find libmysqlclient under /usr

    今天在64位centos5.6系统上编译PHP5.2.17报错 checking for MySQL support... yes, shared checking for specified loc ...

  10. QQ音乐API分析记录

    我一直是QQ音乐的用户,最近想做一个应用,想用QQ音乐的API,搜索了很久无果,于是就自己分析QQ音乐的API. 前不久发现QQ音乐出了网页版的,是Flash的,但是,我用iPhone打开这个链接的时 ...