我是Java新手,因此对以下示例感到困惑。可以认为“ ==”符号会比较 Intger 和 Int中“自动装箱” Integer 之间的值,并比较Integer之间的引用地址吗?
那么双打和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)); } }
结果是:
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
出现时arithmetic operators,取消装箱将会进行comparison operators。
arithmetic operators
comparison operators
例如:
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
但是何时==出现,取决于情况。
==
如果boxing type出现在both side,它将进行比较the reference。但是,如果base type出现在one side,而另一侧是boxing type,则Boxing type将为unboxingbase type。
both side
the reference
one side
unboxing
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:在Java.lang.Integer Cache中,按照JLS的要求,为-128到127(含)之间的值支持自动装箱的对象标识语义。 查看源代码
Java.lang.Integer
所以:
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