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. C#之base关键字

    1.base关键字用于从派生类中访问基类的成员. 2.调用基类上已被其他方法重写的方法. 3.指定创建派生类的实例是应调用基类的构造函数. 4.访问基类的公有成员和受保护成员,不能访问私有成员 5在静 ...

  2. css笔记——关于 body/html 的高度百分比

    body{  height:100%;  视窗的高度 min-height:100%;文档的具体高度} 这两个百分比的具体高度在页脚永远放在文档底部非常重要,此时用min-height:100% 具体 ...

  3. 【转载】Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载六)Linux的网络配置

    本篇是Linux小白最佳实践第6篇,目的就是让白菜们了解Linux网络是如何配置的.Linux系统在服务器市场占有很大的份额,尤其在互连网时代,要使用计算机就离不开网络. 想每天能听到小妞的语音播报, ...

  4. 【转】C#类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)

    静态类 -------------------------------------------------------------------------------- 静态类就是在class关键字前 ...

  5. [DevExpress]ChartControl之基准线示例

    关键代码: /// <summary> /// 创建基准线ConstantLine /// </summary> /// <param name="chart& ...

  6. tomcat源码解读(2)–容器责任链模式的实现

    责任链模式:责任链模式可以用在这样的场景,当一个request过来的时候,需要对这个request做一系列的加工,使用责任链模式可以使每个加工组件化,减少耦合.也可以使用在当一个request过来的时 ...

  7. 别让emacs损伤你的小母指

    刚接触emacs时感觉,这东西怎么这么难用,还说是编辑器的神,我去. 写个代码跟挫游戏机手柄似的,关键是还这么难挫,平时用的最多的左ctrl键,这么难按,可怜的我的小母指(Petyr Baelish) ...

  8. php使用注意点

    php使用时间之前要将php.ini中时区设置好,否则会报警告.截图如下:“;date.timezone =”设置为“date.timezone =Asia/Shanghai”即可. apache如果 ...

  9. WebView重定向新开界面问题-b

    首先介绍下这个问题,iOS上WebView 如果想更贴近native,就要加载新URL的时候新开个界面,但是如果加载的链接有重定向的话,就会在中间开一个空白的界面,这个好烦.然后就是解决这个问题,采用 ...

  10. 2017年iOS应用将强制使用HTTPS安全加密-b

    6月14日,WWDC 2016苹果开发者大会上,苹果在讲解全新的iOS10中提到了数据安全这一方面,并且苹果宣布iOS应用将从2017年1月起启用名为App Transport Security的安全 ...