1.[Think in Java笔记]自动包装器和装箱

案例


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

booleanString

byte

Byte

byteString

char

Character

char

double

Double

doubleString

float

Float

floatdoubleString

int

Integer

intString

long

Long

longString

short

Short

shortString

创建包装器对象

除了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


当==用于比较基本值和包装器时,包装器将解除包装,而比较的是在基本指之间进行的。










本文转自 LinkedKeeper 51CTO博客,原文链接:http://blog.51cto.com/sauron/1224754,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值