有关JAVA自动装箱-拆箱的分析
文章目录
在java常量与常量池 中已经介绍过一些java自动装箱与拆箱的例子。现在单独对自动装箱/拆箱进行总结。
1.JAVA数据类型
java基本数据类型和其包装类对应如下:
基础数据类型 |
长度 |
包装类型 |
---|---|---|
int |
4字节 |
Integer |
byte |
1字节 |
Byte |
short |
2字节 |
Short |
long |
8字节 |
Long |
float |
4字节 |
Float |
double |
8字节 |
Double |
char |
2字节 |
Character |
boolean |
不同虚拟机取值不同 |
Boolean |
2.定义
自动装箱:把基本类型用其包装类替代,使其具有对象的特性。可以调用toString()、hashCode()、getClass()、equals()等方法。 如:
Integer a = 4;
其实编译器调用的是static Integer valueOf(int i)这个方法,valueOf(int i)返回一个表示指定int值的Integer对象,反编译后如下:
Integer a =Integer.valueOf(4);
自动拆箱:将包装类转换为基本类型。 如:
int a = new Integer(4);
实际上编译器内部会调用int intValue()返回该Integer对象的int值。 反编译后如下:
int a = new Integer(4).intValue();
3.发生时机
当出现赋值运算、算数表达式、方法调用等情况时,会触发自动装箱/拆箱操作。
Integer a = 1;
Integer b = 2;
Long c = 3L;
System.out.println(c == (a + b));
System.out.println(c.equals(a + b));
上述问题输出结果:
true
false
说明: c==(a+b),算数表达式先运算 a+b 拆箱操作,得到数值为3。Long与int比较,会自动拆箱,因此最终是 3==3 ,得到值为true。 c.equals(a+b), a+b 拆箱操作,得到数值为 3 int类型。Long与int进行equals,由于不是同一个对象,因此会返回false。 可以查看 Long对象源码,equals 首先需要判断 instanceof 是否为同一对象。
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
4.包装类缓存
查看包装类源码,对于 int byte short long char boolean 这些类型的包装类都实现了一个字节的缓存,(Boolean 只有true和false两种)。float double这两种类型没有缓存。因此在缓存范围内的包装类,使用==时实际是同一对象。
Integer i1 = 127;
Integer i2 = 127;
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i1 == i2); //true 满足缓存访问
System.out.println(i3 == i4);//false 在缓存范围之外
Double d1 = 127.0;
Double d2 = 127.0;
Double d3 = 128.0;
Double d4 = 128.0;
System.out.println(d1 == d2);//false 没有缓存
System.out.println(d3 == d4);//false 没有缓存
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释