bjetos inteiros comparados [duplicado]

Esta pergunta já tem uma resposta aqui:

Como comparar corretamente dois números inteiros em Jav 8 respostas

Eu tenho o seguinte código

public class Test {

    public static void main(String[] args) {

        Integer alpha = new Integer(1);
        Integer foo = new Integer(1);

        if(alpha == foo) {
            System.out.println("1. true");
        }

        if(alpha.equals(foo)) {
            System.out.println("2. true");
        }

    } 

}

A saída é a seguinte:

2. true

No entanto, alterar o tipo de umInteger object paraint produzirá uma saída diferente, por exemplo:

public class Test {

    public static void main(String[] args) {

        Integer alpha = new Integer(1);
        int foo = 1;

        if(alpha == foo) {
            System.out.println("1. true");
        }

        if(alpha.equals(foo)) {
            System.out.println("2. true");
        }

    } 

}

A nova saída:

1. true
2. true

Como isso pode ser assim? Por que o primeiro código de exemplo não gera1. true?

questionAnswers(5)

yourAnswerToTheQuestion