このソースの結果がなんでこうなるのかわかりません。
言語仕様を理解していれば説明できるといわれました。
なんでこうなるのでしょうか?

public class Main {
 public static void main(String[] args) throws Exception {
  Integer int050a = 050; Integer int050b = 050;
  Integer int100a = 100; Integer int100b = 100;
  Integer int150a = 150; Integer int150b = 150;

  Class<?> clazz = Integer.class;
  Field field = clazz.getDeclaredField("value");
  field.setAccessible(true);

  field.setInt(int050a, 050 + 1);
  field.setInt(int100a, 100 + 1);
  field.setInt(int150a, 150 + 1);

  System.out.printf("int050=%d,%d(%b)\n", int050a, int050b, int050a==int050b);
  System.out.printf("int100=%d,%d(%b)\n", int100a, int100b, int100a==int100b);
  System.out.printf("int150=%d,%d(%b)\n", int150a, int150b, int150a==int150b);
 }
}

結果
int050=41,41(true)
int100=101,101(true)
int150=151,150(false)