java基础 --- 装箱和拆箱
Posted Overboom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础 --- 装箱和拆箱相关的知识,希望对你有一定的参考价值。
1. Java数据类型
在Java中,数据类型可以分为两大种,Primitive Type(基本类型)和Reference Type(引用类型)。
基本类型的数值不是对象,不能调用对象的toString()、hashCode()、getClass()、equals()等方法,所以Java提供了针对每种基本类型的包装类型。如下:
INDEX | 基本类型 | 大小 | 数值范围 | 默认值 | 包装类型 |
1 | boolean | --- | true,false | false | Boolean |
2 | byte | 8bit | -2^7-- 2^7-1 | 0 | Byte |
3 | char | 16bit | \\u0000 - \\uffff | \\u0000 | Character |
4 | short | 16bit | -2^15 -- 2^15-1 | 0 | Short |
5 | int | 32bit | -2^31 -- 2^31-1 | 0 | Integer |
6 | long | 64bit | -2^63 -- 2^63-1 | 0 | Long |
7 | float | 32bit | IEEE 754 | 0.0f | Float |
8 | double | 64bit | IEEE754 | 0.0d | Double |
9 | void | --- | --- | --- | Void |
2. Java自动装箱和拆箱的定义
1. 自动装箱:把基本类型用它们对应的引用类型包装起来,使它们具有对象的特质,可以调用toString()、hashCode()、getClass()、equals()等方法。如:
Integer a = 3; //自动装箱
编译器内部会调用static Integer valueOf(int i)这个 方法,valueOf(int i)返回一个指定int值的Integer对象,那么就变成这样
Integer a = 3; ---> Integer a = Integer.valueOf(3);
2. 拆箱:跟自动装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为基本类型的数据。如:
int i = new Integer(2);//这是拆箱
编译器内部会调用int intValue()返回该Integer对象的int值
Note:自动装箱和拆箱由编译器完成,编译器会在编译器根据语法决定是否进行装箱和拆箱操作。
3. 装箱和拆箱是如何实现的
我们就以Interger类为例,下面看一段代码:
package BoxingAndUnboxing;
public class BoxingAndUnboxing {
public static void main(String[] args){
Integer i = 10;
int n = i;
}
}
反编译class文件之后得到如下内容:
public class BoxingAndUnboxing.BoxingAndUnboxing {
public BoxingAndUnboxing.BoxingAndUnboxing();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 10
2: invokestatic #7 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: aload_1
7: invokevirtual #13 // Method java/lang/Integer.intValue:()I
10: istore_2
11: return
}
从反编译得到的字节码内容可以看出,在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。
其他的也类似,比如Double、Character,不相信的朋友可以自己手动尝试一下。
因此可以用一句话总结装箱和拆箱的实现过程:
装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。(xxx代表对应的基本数据类型)。
4. 面试题常见坑
思考下面的代码输出什么
public static void main(String[] args) {
//1
Integer a=new Integer(123);
Integer b=new Integer(123);
System.out.println(a==b);//输出 false
//2
Integer c=123;
Integer d=123;
System.out.println(c==d);//输出 true
//3
Integer e=129;
Integer f=129;
System.out.println(e==f);//输出 false
//4
int g=59;
Integer h=new Integer(59);
System.out.println(g==h);//输出 true
}
常量池模型如下:
参考链接:
https://blog.csdn.net/u013309870/article/details/70229983
以上是关于java基础 --- 装箱和拆箱的主要内容,如果未能解决你的问题,请参考以下文章