8个基本数据类型
- boolean(1)
- byte(8)
- char(16)
- short(16)
- int (32)
- long(64)
- float(32)
- double(64)
每种基本数据类型都有对应的包装器类型,基本数据类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
简单来说 装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。
Integer i = 10; //装箱
int n = i; //拆箱
关于装箱与拆箱相关概念可参考博客 深入剖析Java中的装箱与拆箱
装箱过程是通过调用包装器的 valueOf 方法实现的,拆箱过程是通过调用包装器的
×××value(×××表示对应的基本数据类型)方法实现的。
// 自动装箱,与下方调用 valueOf方法等同
Integer i1 = 200;
Integer i2 = 200;
System.out.println(i1 == i2); // false
Integer i3 = Integer.valueOf(123);
Integer i4 = Integer.valueOf(123);
System.out.println(i3 == i4); // true
Integer i5 = new Integer(200);
Integer i6 = new Integer(200);
System.out.println(i6 == i5); // false
new Integer() 与 Integer.valueOf() 的区别在于,new Intege() 每次都会创建一个新的对象,而 Integer.valueOf() 可能会使用缓存对象,这涉及到缓存池,Integer的缓存池大小默认为-128~127,当数值在 [-128,127] 时,便返回指向Integer缓存池 (IntegerCache.cache )中已经存在的对象的引用;否则,创建一个新的Integer对象。
- i1 和 i2 数值为200,会创建新的对象,因此不等
- i3 和 i4 数值为123 ,指向同一个对象,因此相等
- i5 和 i6 都是直接创建新的对象,因此不等