Ja, an String-Literale hatte ich auch schon die ganze Zeit gedacht, die existieren auch nur einmal in einem Stringpool! Nur das es hier bei Integer i = 10; (Zuweisung eines Wrappers zu einem primitiven Datentyp) nur ein bestimmter Zahlenbereich ist, der nur einmal vorhanden ist: von -128 bis 127. Diese Zahlen existieren auch nur einmal im Cache / Pool. So reagiert dieser Zahlenbereich beim Vergleich mit == genau gleich wie String-Literale, es wird nicht die Referenz verglichen, sondern die Zahl. Und dies hat ein true zur Folge.