java自动装箱,Java自动装箱规则

I am a java novice and so confused by the following example. Is it okay to think that "==" sign will compare the values between Integers and "autoboxed" Integers from int, and compare reference address between Integers?

What about doubles and 0/0?

import edu.princeton.cs.introcs.*;

public class Autoboxing {

public static void cmp(Integer first, Integer second) {

if (first < second)

StdOut.printf("%d < %d\n", first, second);

else if (first == second)

StdOut.printf("%d == %d\n", first, second);

else if (first > second)

StdOut.printf("%d > %d\n", first, second);

else

StdOut.printf("%d and %d are incomparable\n", first, second);

}

public static void main(String[] args) {

cmp(new Integer(42), 43);

cmp(new Integer(42), new Integer(42));

cmp(43, 43);

cmp(142, 142);

Integer a0 = 1000;

int b0 = 1000;

Integer c0 = 1000;

StdOut.println("a0==b0?" + (a0==b0));

StdOut.println("a0==c0?" + (a0==c0));

StdOut.println("b0==c0?" + (b0==c0));

double x1 = 0.0, y1 = -0.0;

Double a1 = x1, b1 = y1;

StdOut.println(x1 == y1);

StdOut.println(a1.equals(b1));

double x2 = 0.0/0.0, y2 = 0.0/0.0;

Double a2 = x2, b2 = y2;

StdOut.println(x2 != y2);

StdOut.println(!a2.equals(b2));

}

}

The result is:

42 < 43

42 and 42 are incomparable

43 == 43

142 and 142 are incomparable

=====

a0==b0?true

a0==c0?false

b0==c0?true

=====

true

false

=====

true

false

解决方案

Unboxing will be happing when arithmetic operators, comparison operators appear.

eg:

Integer a = 10;

a = a+10; //1.unboxing a to int 2.calculate a+10 3.boxing 20 to Integer.

System.out.print(a > 10); //1.unboxing a to int 2. compare

But when == appear, it depends.

If boxing type appear on both side, it will compare the reference.But if base type appear on one side, and the other side is a boxing type, the boxing type will unboxing to base type.

eg:

Integer a = new Integer(129);

Integer b = new Integer(129);

System.out.println(a == b); // compare reference return false

System.out.println(a == 129); // a will unboxing and compare 129 == 129 return true

PS: In Java.lang.Integer Cache to support the object identity semantics of autoboxing for values between -128 and 127 (inclusive) as required by JLS.

See source code

So:

Integer a = 127;

Integer b = 127; //cached, the same as b a==b return ture

Integer c = 129;

Integer d = 129; // not cached, c==d return false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值