Il motivo è semplice: l'operatore di confronto == lavora sul valore del reference, non sull'oggetto puntato dal reference. Di conseguenza x e y sono due oggetti distinti, ciascuno con un proprio indirizzo in memoria... il confronto fatto con == guarda gli indirizzi di memoria. Se vuoi confrontare due oggetti devi usare il metodo equals() (forse l'hai già visto per le stringhe, che sono anch'esse oggetti).
codice:
Integer x = new Integer( 1000 );
Integer y = new Integer( 1000 );
boolean confronto1 = (x == y); // falso: due indirizzi diversi
boolean confronto2 = x.equals( y ); // vero: si guarda il contenuto
x = y;
boolean confronto3 = (x == y); // vero: entrambi puntano allo stesso oggetto
Ciao.