Операторы "++" и "+ =" определены только для примитивов.
Следовательно, когда вы применяете их к Long
, распаковка должна произойти до того, как оператор будет оценен, а затем для сохранения результата должен иметь место бокс.
Бокс, вероятно, стоит больше, чем распаковка, поскольку для распаковки требуется только вызов метода, а для бокса - создание экземпляра объекта.
Каждый бокс включает создание Long
экземпляра. Ваш l oop имеет Integer.MAX_VALUE
итераций, поэтому второй l oop создает более 2 миллиардов Long
объектов (по одному на каждую sum+=i
операцию), в то время как третий l oop создает более 4 миллиардов Long
объектов (один для каждой операции i++
и один для каждой операции sum+=i
). Эти объекты необходимо создать, а затем собрать мусор. Это стоит времени.