a comparación de dobles en Java da resultados extraño

Realmente no puedo entender por qué sucede lo siguiente:

Double d = 0.0;
System.out.println(d == 0); // is true
System.out.println(d.equals(0)); // is false ?!

Sin embargo, esto funciona como se esperaba:

Double d = 0.0;
System.out.println(d == 0.0); // true
System.out.println(d.equals(0.0)); // true

Estoy seguro de que esto está relacionado con el autoboxing de alguna manera, pero realmente no sépor qué0 estaría en una caja diferente cuando== operador se utiliza y cuando.equals se llam.

¿No viola esto implícitamente laequals contrato @

  *  It is reflexive: for any non-null reference value
  *     x, x.equals(x) should return
  *     true.

EDITA:

Gracias por las respuestas rápidas. Pensé que está encuadrado de manera diferente, la verdadera pregunta es:por qu ¿está en caja diferente? Quiero decir que esto sería más intuitivo sid == 0d qued.equals(0d) es intuitivo y esperado, sin embargo sid == 0 que parece unaInteger estrue que 'intuitivamente'd.equals(0) también debería ser cierto.

Respuestas a la pregunta(5)

Su respuesta a la pregunta