Встречаются ли в этом коде какие-либо блокировки / распаковки - PullRequest
2 голосов
/ 07 марта 2019

Учитывая приведенный ниже код, применяет ли компилятор Java какой-либо бокс / распаковку в этом случае?

public static Integer sum(Iterable<Integer> numbers){
    Integer sum = 0;
    for(Integer n : numbers){
        sum += n;
    }

    return sum;
}

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Да, объект Integer преобразуется в литерал int при выполнении сложения с оператором +. Взгляните на эту ссылку . Там сказано следующее:

Поскольку операторы остаток (%) и унарный плюс (+ =) не применяются для целочисленных объектов, вы можете спросить, почему компилятор Java компилирует метод без выдачи каких-либо ошибок. Компилятор не генерирует ошибка, потому что он вызывает метод intValue для преобразования целого числа в int во время выполнения.

1 голос
/ 07 марта 2019

Здесь int 0 автоматически упаковывается в целую сумму:

Integer sum = 0;

Здесь значения распакованы, так как унарный оператор плюс применяется только к int:

sum += n;

Здесь не происходит распаковка, когда вы перебираете целые числа:

for(Integer n : numbers)

Распаковка в цикле for может произойти, если вы сделаете (например,):

for(int n : numbers)

См. Автобокс и распаковка для очень похожих примеров и объяснений.

...