案例
1
2
3
4
5
6
7
8
9
10
11
12
|
int
i1 =
1024
;
Integer i2 = Integer.valueOf(
"1024"
);
System.out.println(i1 == i2);
//true
int
i3 =
24
;
Integer i4 =
new
Integer(
"24"
);
System.out.println(i3 == i4);
//true
int
i5 =
new
Integer(
"10"
);
Integer i6 =
new
Integer(
"10"
);
System.out.println(i5 == i6);
//true
Integer i7 =
new
Integer(
"10"
);
Integer i8 =
new
Integer(
"10"
);
System.out.println(i7 == i8);
//false
|
包装器类概述
基本类型 | 包装器类 | 构造函数变元 |
boolean | Boolean | boolean或String |
byte | Byte | byte或String |
char | Character | char |
double | Double | double或String |
float | Float | float、double或String |
int | Integer | int或String |
long | Long | long或String |
short | Short | short或String |
创建包装器对象
除了Character之外,其余包装器类/都提供两个构造函数:一个以要构建的基本类型作为变元,另一个以要构建类型的String表示作为变元。如:
1
2
|
Integer i1 =
new
Integer(
24
);
Integer i1 =
new
Integer(
"24"
);
|
Boolean包装器类的构造函数带有boolean值true或false,或者以一个值为"true"或"false"的String作为变元。
包装器转换
primitive.xxxValue() —— 将包装器转换为基本类型
1
2
|
Float f =
new
Float(
3
.14f);
short
s = f.shortValue();
|
primitive.parseXxx(String) —— 将String类型转换为基本类型
1
|
double
d = Double.parseDouble(
"3.14"
);
|
Wrapper.valueOf(String) —— 将String转换为包装器
1
|
Double d = Double.valueOf(
"3.14"
);
|
自动装箱
在Java5之前:
1
2
3
4
|
Integer y =
new
Integer(
567
);
int
x = y.intValue();
x++;
y =
new
Integer(x);
|
在Java5新特性中:
1
2
|
Integer y =
new
Integer(
567
);
y++;
|
代码看上去/在一个对象引用变量上/使用后递增运算符。我们知道,包装器对象是不可变的,这个例子似乎与这种声明相矛盾。实际上,创建了第二个包装器对象,并将值设置为568。
1
2
3
4
5
6
|
Integer y =
567
;
Integer x = y;
System.out.println(y == x);
//true
y++;
System.out.println(x +
" "
+ y);
//567 568
System.out.println(y == x);
//false
|
因此,在底层,当编译器到达"y++;"这一行时,它必须用如下所示的内容代替它:
1
2
3
|
int
x2 = y.intValue();
x2++;
y =
new
Integer(x2);
|
必须在某处有一个new的调用。
装箱、==和equals()方法
对于所有的包装器类,如果两个对象具有相同的类型和相同的值,他们就是相等的。
1
2
3
4
5
6
|
Integer i1 =
1000
;
Integer i2 =
1000
;
System.out.println(i1 == i2);
//false
Integer i3 =
10
;
Integer i4 =
10
;
System.out.println(i3 == i4);
//true
|
为什么当==指出i3和i4是同一个对象时,i1和i2是不同的对象?为了节省内存,对于下列包装器的对象的两个实例(通过装箱创建),当他们的基本值相同时,他们总是==关系:
lBoolean
lByte
l从\u0000到\u007f的字符(7f是十进制的127)
l-128~127的Short和Integer
1
2
3
4
5
6
7
8
9
10
11
12
13
|
int
i1 =
1024
;
Integer i2 = Integer.valueOf(
"1024"
);
System.out.println(i1 == i2);
//true
int
i3 =
24
;
Integer i4 =
new
Integer(
"24"
);
//自动装箱
System.out.println(i3 == i4);
//true
//这里实际上是:i1 == i2.intValue()
int
i5 =
new
Integer(
"10"
);
//自动拆箱
Integer i6 =
new
Integer(
"10"
);
System.out.println(i5 == i6);
//true
Integer i7 =
new
Integer(
"10"
);
//自动装箱
Integer i8 =
new
Integer(
"10"
);
//自动装箱
System.out.println(i7 == i8);
//false
|
当==用于比较基本值和包装器时,包装器将解除包装,而比较的是在基本指之间进行的。