案例
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
包装器类概述基本类型包装器类构造函数变元
booleanBooleanboolean或String
byteBytebyte或String
charCharacterchar
doubleDoubledouble或String
floatFloatfloat、double或String
intIntegerint或String
longLonglong或String
shortShortshort或String
创建包装器对象
除了Character之外,其余包装器类/都提供两个构造函数:一个以要构建的基本类型作为变元,另一个以要构建类型的String表示作为变元。如:
Integer i1 = new Integer(24);
Integer i1 = new Integer("24");
Boolean包装器类的构造函数带有boolean值true或false,或者以一个值为"true"或"false"的String作为变元。
包装器转换
primitive.xxxValue()—— 将包装器转换为基本类型
Float f = new Float(3.14f);
short s = f.shortValue();
primitive.parseXxx(String)—— 将String类型转换为基本类型
double d = Double.parseDouble("3.14");
Wrapper.valueOf(String)—— 将String转换为包装器
Double d = Double.valueOf("3.14");
自动装箱
在Java5之前:
Integer y = new Integer(567);
int x = y.intValue();
x++;
y = new Integer(x);
在Java5新特性中:
Integer y = new Integer(567);
y++;
代码看上去/在一个对象引用变量上/使用后递增运算符。我们知道,包装器对象是不可变的,这个例子似乎与这种声明相矛盾。实际上,创建了第二个包装器对象,并将值设置为568。
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++;"这一行时,它必须用如下所示的内容代替它:
int x2 = y.intValue();
x2++;
y = new Integer(x2);
必须在某处有一个new的调用。
装箱、==和equals()方法
对于所有的包装器类,如果两个对象具有相同的类型和相同的值,他们就是相等的。
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
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
当==用于比较基本值和包装器时,包装器将解除包装,而比较的是在基本指之间进行的。
说明:笔记内容摘自《SCJP考试指南》