`

JAVA自动装箱拆箱

阅读更多
  • 什么是自动装箱拆箱

基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。 

一般我们要创建一个类的对象实例的时候,我们会这样:

 Class a = new Class(parameter);

 当我们创建一个Integer对象时,却可以这样:

 Integer i = 100; (注意:不是 int i = 100; )

实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100); 

此即基本数据类型的自动装箱功能。

 
  • 基本数据类型与对象的差别 

基本数据类型不是对象,也就是使用int、double、boolean等定义的变量、常量。

基本数据类型没有可调用的方法。

eg:  int t = 1;     t.  后面是没有方法滴。

 Integer t =1; t.  后面就有很多方法可让你调用了。

 
  • 什么时候自动装箱

例如:Integer i = 100;

相当于编译器自动为您作以下的语法编译:Integer i = Integer.valueOf(100);

 
  • 什么时候自动拆箱

  自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出。如下可实现自动拆箱:

1 Integer i 10//装箱 
2  int t = i; //拆箱,实际上执行了 int t = i.intValue();

  在进行运算时,也可以进行拆箱。 

1 Integer i 10
2 System.out.println(i++);

 

  • Integer的自动装箱

复制代码
//在-128~127 之外的数
Integer i1 =200;
Integer i2
=200;
System.out.println(
"i1==i2: "+(i1==i2));
// 在-128~127 之内的数
Integer i3 =100;
Integer i4
=100;
System.out.println(
"i3==i4: "+(i3==i4));
复制代码
    输出的结果是:
    i1==i2: false
i3
==i4: true

 说明:

equals() 比较的是两个对象的值(内容)是否相同。

"==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。

 

前面说过,int 的自动装箱,是系统执行了 Integer.valueOf(int i),先看看Integer.java的源码:

1
2
3
4
5
6
public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)  // 没有设置的话,IngegerCache.high 默认是127
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

  

对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回的是缓存的Integer对象(并不是新建对象)

所以范例中,i3 与 i4实际上是指向同一个对象。

而其他值,执行Integer.valueOf(int i) 返回的是一个新建的 Integer对象,所以范例中,i1与i2 指向的是不同的对象。

当然,当不使用自动装箱功能的时候,情况与普通类对象一样,请看下例:

 

1 Integer i3 =new Integer(100); 
2 Integer i4 =new Integer(100); 
3 System.out.println("i3==i4: "+(i3==i4));//显示false

(感谢易之名的提醒O(∩_∩)O~)

 

  • String 的拆箱装箱

先看个例子:

复制代码
1 String str1 ="abc";
2 String str2 ="abc";
3 System.out.println(str2==str1); //输出为 true 
4 System.out.println(str2.equals(str1)); //输出为 true 
5   
6 String str3 =new String("abc");
7 String str4 =new String("abc"); 
8 System.out.println(str3==str4); //输出为 false 
9 System.out.println(str3.equals(str4)); //输出为 true
复制代码

    这个怎么解释呢?貌似看不出什么。那再看个例子。

1 String d ="2"
2 String e ="23";
3 = e.substring(01);
4 System.out.println(e.equals(d)); //输出为 true 
5 System.out.println(e==d); //输出为 false
第二个例子中,e的初始值与d并不同,因此e与d是各自创建了个对象,(e==d)为false 。
同理可知,第一个例子中的str3与str4也是各自new了个对象,而str1与str2却是引用了同一个对象。
 
 出自:http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html
 参考:
http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 
http://javarevisited.blogspot.com/2012/07/auto-boxing-and-unboxing-in-java-be.html 
分享到:
评论

相关推荐

    java自动装箱拆箱深入剖析

    Java中的自动装箱和拆箱是自J2SE 5.0版本引入的特性,它极大地简化了基本数据类型与其对应的包装类之间的转换过程。基本数据类型包括int、double、boolean等,而包装类如Integer、Double和Boolean分别对应这些基本...

    JAVA装箱拆箱(很详细、易于理解)

    从Java 5开始,引入了自动装箱和拆箱特性,使得基础数据类型和其包装器类之间的转换更加方便。例如: ```java Integer y = 567; // 自动装箱 y++; // 自动拆箱,自增,再自动装箱 System.out.println("y = " + y); ...

    Java自动装箱与拆箱深度解析:原理、应用与性能考量

    在Java编程中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个非常核心的概念,它们允许基本数据类型和它们对应的包装类之间无缝转换。这种转换机制在Java 5中引入,极大地简化了代码编写,但同时也带来了一些...

    Java中的自动装箱与拆箱Java开发Java经验技巧共6

    在Java编程语言中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个重要的特性,它们简化了基本类型(如int、double等)与对应的包装类(如Integer、Double等)之间的转换过程。这些特性是在Java 5引入的,极大...

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

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

    Java中自动装箱、拆箱引起的耗时详解

    Java中自动装箱、拆箱引起的耗时详解 Java中自动装箱和拆箱是Java语言中一个重要的特性,它可以将基本数据类型和它们的包装类之间进行转换,这个过程是透明的,程序员不需要手动进行转换。但是,这个过程会引起一些...

    详解Java 自动装箱与拆箱的实现原理

    Java自动装箱和拆箱的实现原理是 Java语言的一个重要特性,它使得开发者可以更加方便地使用原始类型和封装类之间的转换,但是同时也容易引发一些疑惑和错误。通过了解自动装箱和拆箱的实现原理,我们可以更好地使用...

    Java中的自动装箱与拆箱_.docx

    在Java编程语言中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是从Java 1.5版本开始引入的一项特性,其目的是简化原始类型(Primitive Types)与它们对应的包装类(Wrapper Classes)之间的转换过程。...

    Java中的自动装箱和拆箱是什么?它们有什么作用?(java面试题附答案).txt

    ### Java中的自动装箱与拆箱 #### 一、概念介绍 在Java中,自动装箱(Autoboxing)和拆箱(Unboxing)是Java编译器提供的一种特性,用于在基本数据类型和对应的包装类之间进行自动转换。这种特性简化了编程过程中...

    什么是自动装箱和自动拆箱.xmind

    什么是自动装箱和自动拆箱

    Java中的自动装箱与拆箱:深入理解基本数据类型与对象的转换

    ### Java中的自动装箱与拆箱详解 #### 引言 在Java开发过程中,开发者经常需要处理各种数据类型之间的转换。对于基本数据类型与包装类之间的转换,Java提供了一个非常便利的功能——自动装箱和自动拆箱。这些功能...

    Java 装箱与拆箱详解及实例代码

    装箱(Boxing)是Java自动将基本数据类型转换为对应的包装类的过程。例如,int类型转换为Integer,char类型转换为Character等。这是Java 5引入的自动装箱特性,旨在简化代码,提高开发效率。当我们将一个基本类型...

    Java中的自动装箱与拆箱

    自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象。自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接。  如果你在Java...

    java编程中自动拆箱与自动装箱详解

    Java编程中自动拆箱与自动装箱详解 Java编程中自动拆箱与自动装箱是从J2SE 5.0开始提供的功能,可以简化Java编程中的数据类型转换。下面是自动拆箱与自动装箱的详细解释: 1. 基本数据类型的自动装箱(Autoboxing...

    详解Java包装类及自动装箱拆箱

    "详解Java包装类及自动装箱拆箱" Java 包装类是 Java 语言中的一种基本类型的封装体,它将基本类型的值“包装”到对象中,使基本类型的值能够包含在集合中,或者作为方法的返回值。Java 包装类有两个主要的目的:将...

    浅谈Java自动装箱与拆箱及其陷阱

    Java中的自动装箱和拆箱是自JDK 1.5版本引入的一种语言特性,它极大地简化了基础数据类型(如int)与它们对应的包装类(如Integer)之间的转换过程。这一特性使得开发者无需手动创建包装类实例或使用显式类型转换,...

    深入剖析Java中的装箱和拆箱

    自动装箱和拆箱问题是Java中一个老生常谈的问题了,我们来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。  以下是本文的目录大纲:...

    深入理解Java中的装箱和拆箱

    “深入理解Java中的装箱和拆箱” 一、什么是装箱?什么是拆箱? 在Java中,每种基本数据类型都有对应的包装器类型,例如int对应Integer、byte对应Byte等。装箱是指将基本数据类型自动转换为包装器类型的过程,而...

    字节码解释Java自动装箱和拆箱的操作

    java是个包装特别好的绅士,其实即便编译器悄悄在私底下干了什么龌龊事儿,我们一般来说也不是很容易看的到。  不过这些问题可以通过看字节码来解决。  代码很简单: Integer x = 5; x++;  且看字节码: ...

    Java软件开发实战 Java基础与案例开发详解 8-3 装箱和拆箱 共4页.pdf

    ### Java中的装箱和拆箱 ...通过上述讨论可以看出,Java通过包装类、自动装箱和拆箱等功能,极大地简化了开发者的工作,并且增强了程序的灵活性和可读性。这对于理解和使用Java语言是非常有帮助的。

Global site tag (gtag.js) - Google Analytics