`

Java语言中的自动装箱和拆箱过程简述

    博客分类:
  • Java
阅读更多

首先介绍一下基本类数据类型对应的包装类中Cache类(包装类中的静态内部类),例如Integer对应的Cache类为IntegerCache。下面附上Integer类中的IntegerCache源码:

private static class IntegerCache {

        static final int low = -128;

        static final int high;

        static final Integer cache[];

 

        static {

            // high value may be configured by property

            int h = 127;

            String integerCacheHighPropValue =

                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

            if (integerCacheHighPropValue != null) {

                int i = parseInt(integerCacheHighPropValue);

                i = Math.max(i, 127);

                // Maximum array size is Integer.MAX_VALUE

                h = Math.min(i, Integer.MAX_VALUE - (-low));

            }

            high = h;

 

            cache = new Integer[(high - low) + 1];

            int j = low;

            for(int k = 0; k < cache.length; k++)

                cache[k] = new Integer(j++);

        }

 

        private IntegerCache() {}

    }

下面就以Integer为例简单说下自动装箱和拆箱的过程吧。

1、Integer的自动装箱

Integer a = 100;//这条语句是怎么执行的呢?

其实只是简单的调用了Integer中的静态方法:public static Integer valueOf(int i);

  看到上面的语句大家是不是豁然开朗了呢,下面让我们再看下valueOf方法为我们做了一些什么事情:

    public static Integer valueOf(int i) {

        assert IntegerCache.high >= 127;

        if (i >= IntegerCache.low && i <= IntegerCache.high)

            return IntegerCache.cache[i + (-IntegerCache.low)];

        return new Integer(i);

    }

 从上面的IntegerCache源码中我们知道它其实是创建了一个静态的Integer数组。并对应包装了-128-127之间对应整型数值(high value may be configured by property)。这就可以解释编程中遇到的一些“奇怪”的现象了:

Integer a = 100;

Integer b = 100;

System.out.println(a == b);//true

//-----------------------------------------

Integer a = 128;

Integer b = 128;

System.out.println(a == b);//false

2、Integer的拆箱

Integer a = 100;

int b = a;

上述的b =a语句其实是调用了Integer的静态方法ntValue();

 包装类大同小异,有兴趣的java爱好者可以查看源码进行分析。

上述都是个人学习中遇到问题和解决问题过程中所学所悟,如若个人理解有偏差敬请谅解。

 

 

  • 大小: 7.4 KB
  • 大小: 5.9 KB
分享到:
评论

相关推荐

    实习生java面试题集及详细答案.pdf

    自动装箱和拆箱是Java 5中引入的一种机制,旨在简化基本数据类型和对应的对象类型之间的转换。自动装箱将基本数据类型转换为对应的对象类型,而拆箱将对象类型转换为基本数据类型。自动装箱和拆箱的优点是简化了编程...

    Java面向对象程序设计语言课程设计指导书.pdf

    5. Java的版本和新特性:文档中的“Java24567”可能是指Java的不同版本,例如Java 1.2、Java 1.3、Java 1.4、Java 5、Java 6和Java 7等,各自引入了不同的新特性,如泛型、自动装箱和拆箱、增强型for循环、枚举类型...

    张龙 Java SE 课程笔记下载

    9. **包装类与自动装箱拆箱**:介绍原始数据类型对应的包装类,以及它们在与对象交互时的自动装箱和拆箱机制。 10. **JVM与内存管理**:简述Java虚拟机的工作原理,包括类加载机制、内存区域划分、垃圾收集器和内存...

    Java基础知识点.html

    Date类 自动拆箱和自动装箱 Arrays 类和接口的关系 内部类 成员内部类 局部内部类 匿名内部类 抽象类 接口 多态 封装 类和对象 方法 StringBuilder类 String类 static for循环 final 权限修饰符 跳转控制语句 while...

    java基础教程

    13. **包装类**:讲解Java为基本数据类型提供的包装类,如Integer、Double等,以及它们的自动装箱和拆箱机制。 14. **泛型**:深入理解泛型的用途,包括泛型类、泛型方法和通配符。 15. **接口与抽象类**:讨论...

    34个java问题.pdf

    - `import javax`:导入Java扩展包中的类和接口,如`javax.swing`等,通常用于扩展Java的核心功能。 #### 17. 接口和抽象类的区别 - **接口**:仅包含抽象方法和常量,不能包含具体实现。接口用于定义行为的标准。...

    Java面试题集锦6:华为面试题 管理资料.pdf

    在自动装箱和拆箱时,两者可以相互转换。 4. **String和StringBuffer的区别**:String是不可变对象,每次修改都会创建新的对象;StringBuffer是可变对象,修改时不会创建新对象,适合在多线程环境中使用,以避免...

    v3.0-JavaGuide面试突击版.pdf

    10. ⾃动装箱与拆箱 二、Java 集合框架 1. 说说 List、Set、Map 三者的区别? 2. Arraylist 与 LinkedList 区别? 3. RandomAccess接⼝ 4. 双向链表和双向循环链表 5. Collections ⼯具类和 Arrays ⼯具类常⻅⽅法...

    自测试卷5.doc1.简述C#、Java和C++的比较。 2.已知变量x的初值为24,则表达式x+=x--+=x%=17运算的结果值为( )。

    3. **装箱拆箱** 装箱是将值类型转换为对应的引用类型,例如将int转为object。拆箱则是相反的过程,将引用类型转换回值类型。装箱会产生一个新的对象,而拆箱需要确保对象实际存储的值与目标类型匹配,否则会抛出...

    java面试题

    - `Integer`可以通过`new`关键字创建对象,也可以通过自动装箱/拆箱与`int`互转。 9. **&和&&的区别?** - `&`是位运算符,用于按位与操作。 - `&&`是逻辑运算符,用于逻辑与操作,具有短路效果。如果左侧...

    spring,springMVC,mybatis学习资料(B站黑马总结)

    4. 当进行自动拆箱或装箱操作时,int和Integer之间可以自动转换,但频繁的装箱拆箱可能会引起性能问题。 除此之外,还涉及了Mybatis的入门知识,包括如何配置和使用Mybatis进行数据持久化操作。例如,IUserDao接口...

    Java面试八股文十万字总结.docx

    Java自动装箱与拆箱** - **装箱**:将基本类型转换为对应的包装类。 - **拆箱**:将包装类转换为基本类型。 **7. 重载和重写的区别** - **重载**:在同一类中,方法名相同但参数列表不同。 - **重写**:在子类中...

    java程序员面试宝典

    `int`是基本数据类型,`Integer`是`int`的包装类,提供了许多额外的功能,如对象创建、自动装箱/拆箱等。`int`的使用更高效,而`Integer`适用于需要对象的地方。 #### 15. Math.round()函数的行为 `Math.round(11.5...

    技术面试题汇总

    - 在自动装箱和拆箱的情况下,两者可以互相转换。 **4. String和StringBuffer的区别?** - `String`是不可变的字符串对象,一旦创建就不能更改。 - `StringBuffer`是可变字符串类,可以在原对象上进行修改,支持...

    黑马面试题总结

    - **自动装箱/拆箱:** - 自动将基本数据类型的值转换成对应的包装类对象,反之亦然。 **示例问题:** - 解释JDK 1.5中引入的新特性有哪些? - 如何使用JDK 1.5中的泛型? - 解释JDK 1.5中新增的枚举类型。 --- ...

    C Sharp完全手册.pdf

    - **4.3 装箱和拆箱** - **过程说明**:解释值类型和引用类型之间的转换机制。 - **4.4 小结** ##### 第五章:变量和常量 - **5.1 变量** - **变量声明**:讲解如何声明和初始化变量。 - **变量作用域**:介绍...

    收汇宝网络技术服务有限公司面试题目

    4. **自动装箱/拆箱**:基本类型与包装类之间的转换更加方便。 5. **注解**:用于元数据的声明,支持自定义注解。 #### 题目八:Hibernate优缺点 **题目描述**:简述Hibernate的优点和缺点。 **知识点解析**: 1. ...

    Microsoft.Net常见问题集锦

    - 装箱是指将值类型转换为引用类型的过程,拆箱则是相反的过程。这些转换发生在值类型与引用类型(如 `object`)之间。 39. **什么是受管制的代码?** - 受管制的代码是指在 .NET Framework 中运行的代码,这些...

Global site tag (gtag.js) - Google Analytics