Difference between double and Double in comparison

c and d are technically two different objects and == operator compares only references.

c.equals(d)

is better as it compares values, not references. But still not ideal. Comparing floating-point values directly should always take some error (epsilon) into account (Math.abs(c - d) < epsilon).

Note that:

Integer c = 1;
Integer d = 1;

here comparison would yield true, but that's more complicated (Integer internal caching, described in JavaDoc of Integer.valueOf()):

This method will always cache values in the range -128 to 127, inclusive, and may cache other values outside of this range.

Why valueOf()? Because this method is implicitly used to implement autoboxing:

Integer c = Integer.valueOf(1);
Integer d = Integer.valueOf(1);

See also

  • Weird Integer boxing in Java
  • How to properly compare two Integers in Java?

When applied to expressions of a class type, == will always perform a reference comparison (JLS section 15.21.3). So this line:

System.out.println(c == d); 

is checking whether c and d refer to the same objects. Auto-boxing in Java always (I believe) creates a new object for float and double (the situation is more complicated for integral types1). Therefore c and d refer to different objects, and so it prints false.

If you want to compare objects for equality, you need to call equals explicitly:

System.out.println(c.equals(d));

With double, it's using numeric equality instead - as specified in section 15.21.1. Hence the difference in behaviour.


1 For integral autoboxing, "small" values are cached - so autoboxing 5 (say) will return the same reference every time. The definition of "small" is implementation-specific, but it's guaranteed within the range -128 to 127. See the bottom of section 5.1.7 for details.

Tags:

Double

Java