W obydwu przypadkach deklarujesz zmienną typu Integer i w obydwu przypadkach przypisujesz do niej referencję do obiektu typu Integer. W pierwszym przypadku jawnie korzystasz z konstruktora i za pomocą słowa new tworzysz nowy obiekt a w drugim przypadku korzystasz z czegoś co nazywa się autoboxing - ponieważ próbujesz przypisać typ prymitywny do zmiennej obiektowej kompilator "za Ciebie" opakowuje ją w obiekt odpowiedniego typu. Z tym, że kompilator wykorzysta tutaj konstrukcję: Integer.valueOf(10);
a nie bezpośrednio konstruktor. Rezultat jest taki, że dla małych wartości obiekty klasy Integer są cachowane, więc nie otrzymasz nowej instancji. W konsekwencji dwukrotne użycie konstrukcji Integer x = 5;
spowoduje, że dwa razy przypisana zostanie referencja do tego samego obiektu.
Na podobnej zasadzie działa tworzenie Stringów poprzez String a = "cachedString";
Jeżeli gdzieś w kodzie dwa razy przypiszesz identyczny napis do zmiennej nie używając operatora new to obydwie zmienne będą wskazywały na ten sam obiekt.
Dla komentarza kawałek kodu:
Integer x = 10;
Integer x1 = 10;
Integer y = new Integer(10);
Integer y1 = new Integer(10);
System.out.println(x==x1); //true !!!
System.out.println(x==y); //false
System.out.println(y==y1); //false
System.out.println(x.equals(x1)); //true
System.out.println(x.equals(y)); //true
System.out.println(y.equals(y1)); //true
Integer a = 129;
Integer a1 = 129;
Integer b = new Integer(129);
Integer b1 = new Integer(129);
System.out.println(a==a1); //false
System.out.println(a==b); //false
System.out.println(b==b1); //false
System.out.println(a.equals(a1)); //true
System.out.println(a.equals(b)); //true
System.out.println(b.equals(b1)); //true