案例
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表示作为变元。如:
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考试指南》
关联:整理了一些Java软件工程师的基础知识点