Comportamento inconsistente no java ==

Considere este código:

class test {
   public static void main(String[] args) {
      test inst_test = new test();
      int i1 = 2000;
      int i2 = 2000;
      int i3 = 2;
      int i4 = 2;
      Integer Ithree = new Integer(2); // 1
      Integer Ifour = new Integer(2); // 2
      System.out.println( Ithree == Ifour );
      inst_test.method( i3 , i4 );
      inst_test.method( i1 , i2 );
   }
   public void method( Integer i , Integer eye ) {
      System.out.println(i == eye );
   }
}

Imprime:

false
true
false

Eu entendo o primeirofalse, o operador == verifica apenas se duas referências estão trabalhando no mesmo objeto, o que, nesse caso, não é.

Os seguintestrue efalse Me faz coçar minha cabeça. Por que Java considerariai3 ei4 igual masi1 ei2 diferente? Ambos foram envolvidos em Integer, não deveriamambos avaliar para falso? Existe uma razão prática para essa inconsistência?

questionAnswers(7)

yourAnswerToTheQuestion