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

案例

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考试指南》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值