`
HelloSure
  • 浏览: 311603 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

关于Java包装类装箱拆箱的小例子

 
阅读更多
简单来说:装箱就是把值类型转变为引用类型,拆箱就是把引用类型转变为值类型
其实这东西没什么好说的,上代码看看就明白了:
/** 
 * @author  hellosure 
 * @time 2011-7-27 上午8:10:46 
 * @description:装箱拆箱例子
 */
public class Test {

	public static void main(String arg[]) {
		int v1 = 100;
		int v2 = 100;
		//自动装箱
		Integer autovalue1  =   100 ;
		Integer autovalue2  =   100 ;
		//手动装箱两种方式
		Integer value1 = Integer.valueOf(v1);
		Integer value2 = Integer.valueOf(v2);
		Integer va1 = new Integer(v1);
		Integer va2 = new Integer(v2);
		//自动拆箱
		int autov1 = autovalue1;
		int autov2 = autovalue2;
		//手动拆箱
		int vv1 = value1.intValue();
		int vv2 = value2.intValue();
		
		
		System.out.println(" v1 == v2 is "+ (v1 == v2));
		System.out.println(" autovalue1 == autovalue2 is "+ (autovalue1 == autovalue2));
		System.out.println(" value1 == value2 is  " + (value1 == value2));
		System.out.println(" va1 == va2 is "+ (va1 == va2));
		System.out.println(" va1 equals va2 is "+ (va1.equals(va2)));
		System.out.println(" autov1 == autov2 is "+ (autov1 == autov2));
		System.out.println(" vv1 == vv2 is "+ (vv1 == vv2));

		System.out.println("-----------------------------------------------------");
		
		String strv1 = "100";
		String strv2 = "100";
		String stringv1 = new String("100");
		String stringv2 = new String("100");
		Integer strvalue1 = Integer.parseInt(strv1);
		Integer strvalue2 = Integer.parseInt(strv2);
		Integer stringvalue1 = Integer.parseInt(stringv1);
		Integer stringvalue2 = Integer.parseInt(stringv2);
		Integer newstrv1 = new Integer(strv1);
		Integer newstrv2 = new Integer(strv2);

		System.out.println(" strv1 == strv2 is "+ (strv1 == strv2));
		System.out.println(" stringv1 == stringv2 is "+ (stringv1 == stringv2));
		System.out.println(" stringv1 equals stringv2 is "+ (stringv1.equals(stringv2)));
		System.out.println(" strvalue1 == strvalue2 is "+ (strvalue1 == strvalue2));
		System.out.println(" stringvalue1 == stringvalue2 is "+ (stringvalue1 == stringvalue2));
		System.out.println(" newstrv1 == newstrv2 is "+ (newstrv1 == newstrv2));
		System.out.println(" newstrv1 equals newstrv2 is "+ (newstrv1.equals(newstrv2)));
		
		System.out.println("-----------------------------------------------------");
		
		int v3 = 200;
		int v4 = 200;
		//自动装箱
		Integer autovalue3  =   200 ;
		Integer autovalue4  =   200 ;
		//手动装箱两种方式
		Integer value3 = Integer.valueOf(v3);
		Integer value4 = Integer.valueOf(v4);
		Integer va3 = new Integer(v3);
		Integer va4 = new Integer(v4);
		//自动拆箱
		int autov3 = autovalue3;
		int autov4 = autovalue4;
		//手动拆箱
		int vv3 = value3.intValue();
		int vv4 = value4.intValue();
		
		
		System.out.println(" v3 == v4 is "+ (v3 == v4));
		System.out.println(" autovalue3 == autovalue4 is "+ (autovalue3 == autovalue4));
		System.out.println(" value3 == value4 is  " + (value3 == value4));
		System.out.println(" va3 == va4 is "+ (va3 == va4));
		System.out.println(" va3 equals va4 is "+ (va3.equals(va4)));
		System.out.println(" autov3 == autov4 is "+ (autov3 == autov4));
		System.out.println(" vv3 == vv4 is "+ (vv3 == vv4));

		System.out.println("-----------------------------------------------------");
		
		String strv3 = "200";
		String strv4 = "200";
		String stringv3 = new String("200");
		String stringv4 = new String("200");
		Integer strvalue3 = Integer.parseInt(strv3);
		Integer strvalue4 = Integer.parseInt(strv4);
		Integer stringvalue3 = Integer.parseInt(stringv3);
		Integer stringvalue4 = Integer.parseInt(stringv4);
		Integer newstrv3 = new Integer(strv3);
		Integer newstrv4 = new Integer(strv4);

		System.out.println(" strv3 == strv4 is "+ (strv3 == strv4));
		System.out.println(" stringv3 == stringv4 is "+ (stringv3 == stringv4));
		System.out.println(" stringv3 equals stringv4 is "+ (stringv3.equals(stringv4)));
		System.out.println(" strvalue3 == strvalue4 is "+ (strvalue3 == strvalue4));
		System.out.println(" stringvalue3 == stringvalue4 is "+ (stringvalue3 == stringvalue4));
		System.out.println(" newstrv3 == newstrv4 is "+ (newstrv3 == newstrv4));
		System.out.println(" newstrv3 equals newstrv4 is "+ (newstrv3.equals(newstrv4)));
		
		System.out.println("-----------------------------------------------------");
		
	}
}

运行结果:
 v1 == v2 is true
 autovalue1 == autovalue2 is true
 value1 == value2 is  true
 va1 == va2 is false
 va1 equals va2 is true
 autov1 == autov2 is true
 vv1 == vv2 is true
-----------------------------------------------------
 strv1 == strv2 is true
 stringv1 == stringv2 is false
 stringv1 equals stringv2 is true
 strvalue1 == strvalue2 is true
 stringvalue1 == stringvalue2 is true
 newstrv1 == newstrv2 is false
 newstrv1 equals newstrv2 is true
-----------------------------------------------------
 v3 == v4 is true
 autovalue3 == autovalue4 is false
 value3 == value4 is  false
 va3 == va4 is false
 va3 equals va4 is true
 autov3 == autov4 is true
 vv3 == vv4 is true
-----------------------------------------------------
 strv3 == strv4 is true
 stringv3 == stringv4 is false
 stringv3 equals stringv4 is true
 strvalue3 == strvalue4 is false
 stringvalue3 == stringvalue4 is false
 newstrv3 == newstrv4 is false
 newstrv3 equals newstrv4 is true
-----------------------------------------------------

小结:
  • 对于new创建出的两个对象,用==比较肯定是不同的,因为指向的不是同一内存
  • Integer装箱过程中调用的是valueOf方法,而 valueOf方法对值在-128到127之间的数值缓存了,源代码如下:

public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
 }

可见,Integer缓存中有一个静态的Integer数组,在类加载时就将-128 到 127 的Integer对象创建了,并保存在cache数组中,一旦程序调用valueOf 方法,如果i的值是在-128 到 127 之间就直接在cache缓存数组中去取Integer对象。
2
3
分享到:
评论

相关推荐

    《深入理解java虚拟机》自动装箱拆箱实例.doc

    在Java中,自动装箱是指将基本数据类型自动转换为对应的包装类对象的过程,而自动拆箱则是指将包装类对象自动转换为基本数据类型的逆过程。这一特性自Java 5起引入,极大地简化了开发者的编程工作。 #### 基本数据...

    Java学习资料-包装类

    以下是关于Java包装类的详细知识: 1. **包装类的定义与作用** - Java的8个基本数据类型包括byte、short、int、long、char、float、double和boolean。每个都有其对应的包装类,分别是Byte、Short、Integer、Long、...

    java封装类的作用

    在JDK 5.0之后,Java引入了自动装箱和拆箱机制,使得开发者能够更便捷地处理基本类型和它们对应的包装类。例如: ```java // 装箱 Integer a = new Integer(1); // 拆箱 int b = a.intValue(); ``` 在早期版本中,...

    Java拆装箱深度剖析

    Java中的拆装箱是面向对象编程中的一种特性,主要用于基本数据类型与其对应的包装类之间的转换。在Java中,为了支持基本数据类型在集合、泛型等高级特性中的使用,引入了包装类,如Integer、Double等。这些包装类的...

    JAVA中实现“相等”比较的深入分析.pdf

    拆箱则是将包装类对象转换回基本数据类型,如将Integer对象拆箱为int类型的值。JDK 1.5版本后,Java支持自动装箱和拆箱,简化了程序中对这两种操作的编码工作。 Java中的对象“相等”比较主要通过两种方式实现:...

    Thinking in Java 3th书籍以及习题解答

    8. 自动装箱拆箱:这是Java 5.0的另一个新特性,简化了基本类型与对应的包装类之间的转换,提高了代码的可读性和简洁性。 9. 可变参数:可变参数是Java 5.0引入的,允许方法接受不定数量的参数,使函数调用更加灵活...

    JAVA5.0新特性讲解与例子

    自动装箱允许在基本类型和对应的包装器类型之间进行无缝转换,减少了手动转换的代码。例如,`Integer i = 10;` 和 `int j = i;` 这样的操作在Java 5.0中变得非常方便。 4. **变长参数(Varargs)** 变长参数允许...

    java笔记,java学习笔记

    Java支持自动装箱和拆箱,这是一种语法糖,允许程序员在基本数据类型和其对应的包装类之间自动转换。例如,`Integer i = 10;`是自动装箱的例子,而`int j = i;`则是自动拆箱的例子。需要注意的是,这种便利性也可能...

    Java 1.6最新版API

    3. **自动装箱与拆箱**:Java 1.5 开始支持自动装箱和拆箱,简化了原始类型和其对应的包装类之间的转换。例如,`Integer` 自动转换为 `int`。 4. **匿名内部类**:Java 允许创建没有名称的内部类,通常用于实现接口...

    Core java.

    - **自动装箱与拆箱**:从Java 5开始,Java引入了自动装箱与拆箱功能,使得在基本类型和对应的包装类之间转换更加方便。 ```java int i = 10; Integer j = i; // 自动装箱 int k = j; // 自动拆箱 ``` ##### ...

    java基础.pdf

    包装类是原始数据类型的对象表示,支持自动装箱和拆箱。Map集合存储键值对,常见的实现包括HashMap和LinkedHashMap。异常处理确保程序在遇到错误时能够优雅地恢复或报告错误。 总之,Java基础涵盖了广泛的编程概念...

    Java基础之自动装箱,注解操作示例

    在Java中,当基本数据类型和包装类交互时,编译器会自动进行装箱和拆箱操作。 例如,`Integer iOb = 1000;` 这一行代码就是自动装箱的例子,它将整型值1000转换为Integer对象。相反,`int i = iOb;` 这行代码则是...

    Java-jdk1.5安装包

    在JDK1.5之前,将基本类型与对应的包装类进行转换需要手动操作。Java 5.0引入了自动装箱和拆箱,使得这种转换更加便捷。例如,int和Integer之间的转换可以自动完成,简化了代码。 五、增强的for循环(Enhanced For ...

    Java五道输出易错题解析(进来挑战下).pdf

    自动装箱是Java 5引入的一种特性,它允许基本类型与对应的包装类之间进行隐式转换。在第三个题目中,Short变量`s1`和`s2`的比较引发了对装箱和拆箱的理解。Java会尝试将`s1`和`s2`转换为相同的对象引用来执行`==`...

    实验项目D、Java应用专题编程

    5. **Java包装类**:如`Integer.parseInt()`和`Integer.toString()`等方法,用于包装类与原始类型之间的转换。 6. **常用类和接口的使用**:如`System.out.println()`、`Math.random()`等。 **文件IO和数据库编程*...

    JAVA 5.0 TIGER程序高手秘笈.rar

    3. **Autoboxing和Unboxing(自动装箱与拆箱)**:Java 5.0自动实现了基本类型与对应的包装类之间的转换。当基本类型与对象之间需要进行操作时,系统会自动进行装箱和拆箱,简化了代码,减少了程序员的工作负担。 4...

    java经典技术

    Integer是int的包装类,可以支持null值,提供了更多方法,如compare()、parseInt()等。在自动装箱拆箱机制下,两者可以在一定情况下互换使用。 以上就是Java经典技术中的一些基础知识点,理解和掌握这些内容对于...

    Java5.0 Tiger程序高手秘笈(含源码)

    3. **自动装箱与拆箱**:Java 5.0引入了自动装箱和拆箱机制,使得原始类型(如int)和它们对应的包装类(如Integer)之间可以无缝转换,简化了编程工作。 4. **变量注解(Annotations)**:注解是一种元数据,用于...

    java Hashtable的泛型化

    3. **自动装箱与拆箱**:对于基本类型对应的包装类,泛型`Hashtable`支持自动装箱(如`Integer`与`int`之间)和拆箱,简化了代码。 4. **可读性**:通过明确指定类型,代码的意图更加清晰,阅读和维护起来更容易。 ...

Global site tag (gtag.js) - Google Analytics