Java 数据类型分两种:
- 基本类型:
boolean
,byte
,char
,short
,int
,long
,float
,double
;- 引用类型:所有
class
和interface
类型,如String
和Map
。
其中引用类型可以赋值为 null,基本类型不可以:
String string = null;
int anInt = null; // Incompatible types
想要把基本类型变成引用类型?这就引出了包装类:
基本类型 | 包装类 |
---|---|
boolean | Boolean |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
Java编译器会自动将基本类型和包装类型转型:
Integer n = 10; // 自动装箱 Integer.valueOf(10)
int m = n; // 自动开箱 Integer.intValue(n)
所有的包装类型都是不变类,一旦创建对象,该对象就是不变的。
Integer 的 valueOf 方法用到了内部类 IntegerCache,这里面创建了数值 -128-127
的对象池,对性能有提升。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
下面一个特别好的例子来说明包装类和基本类型的异同:
Integer i1 = 40;
Integer i2 = 40;
Integer i3 = 0;
Integer i4 = new Integer(40);
Integer i5 = new Integer(40);
Integer i6 = new Integer(0);
Integer i7 = 250;
Integer i8 = 250;
i1 == i2 // true,均引用同一个对象
i1 == i2 + i3 // true
i4 == i5 // false,两个Integer对象
i4.equals(i5) // true,用equals比较引用类型
i4 == i5 + i6 // true,运算过程中自动开箱
i7 == i8 // false,数值超出常量池范围,相当于new两个Integer对象