Hola:
El concepto general es correcto, == compara que dos objetos sean el mismo (misma zona de memoria) y equals(), que cada objeto puede definir a su gusto para saber si dos objetos distintos representan lo mismo o no.
El problema que planteas se debe al compilador. El compilador de java es listo y optimiza el código al compilarlo. Si tienes dos objetos Integer de valor 47 declarados de una forma tan inmediata (Integer a = 47;) el compilador creará un únicoi objeto y lo reutilizará para los.
En este enlace
http://blog.chuidiang.com/2010/06/30...sidad-en-java/ tienes una curiosidad justo con los Integer que puede dar resultados sorprendentes.
Se bueno.