Насколько я знаю, то значения от -128 до 127 находятся в пуле объектов java машины, поэтому имеют один адрес в памяти, а вы объекты сравниваете через ==, т.е. по ссылке
Плюс ко всему, аналогичным образом работает и класс String с методом intern(). К тому же, строковые константы в коде (private final static String) и хардкод (System.out.println(«Hardcode»)) автоматически «интернируются» и попадают в строковый пул.