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
==
can only be used for checking if the variables are equal or not if the variables are primitive types. For object variables,==
is used to compare the reference of the objects. If you want to compare the values of the objects, use.equals()
method.I would not recommend comparing boxed ints with ==, as it works only for some values.
Here is the Tutorial for Autoboxing and Unboxing.
You can also go through JLS#5.1.7. Boxing Conversion and JLS#5.1.8. Unboxing Conversion
0.0 / 0.0
isNaN
you can not compareinfinity
at least in maths. I guess that is why this comparison does not work.From JLS #4.2.3. Floating-Point Types, Formats, and Values
If you check Double#equals method it has two exceptions
This definition allows hash tables to operate properly.
Unboxing will happen for arithmetic operators, comparison operators.
Unboxing will be happing when
arithmetic operators
,comparison operators
appear.eg:
But when
==
appear, it depends.If boxing type appear on
both side
, it will comparethe reference
.But if base type appear onone side
, and the other side is a boxing type, the boxing type willunboxing
to base type.eg:
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 codeSo: