В чем разница в производительности между Integer.valueOf () и Autoboxing - PullRequest
1 голос
/ 10 января 2020

Какая разница в производительности между Integer.valueOf() и Автобоксом?

Это мой код ниже:

    int value = 5;

    //1 Integer.valueOf()
    Integer result =  Integer.valueOf(5);

    //2 Autoboxing
    Integer result = value;  

Примечание: мне нужен Integer Object. Пример: используйте его как ключ в HashMap

Я не знаю, почему и что быстрее? Integer.valueOf() (1) или Автобокс (2).

О (1) Я проверяю java код Integer.valueOf(). Кажется, они получают объект Integer из кэша.

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

О (2) Я слышал, что у JVM есть собственный пул Integer для повторного использования Integer объекта.

Я пытаюсь чтобы понять, но до сих пор не знаю, почему и что быстрее?

1 Ответ

0 голосов
/ 10 января 2020

Этот вопрос тесно связан с этим вопросом . Как уже говорилось в комментариях и в ответе на связанный вопрос, автобокс

вызывает метод stati c Integer.valueOf(), а автоматическая коробка вызова intValue() для данного объекта Integer. На самом деле больше ничего нет - это просто syntacti c sugar.

Очевидно, производительность такая же. Однако все немного сложнее, так как этот ответ говорит:

нет никакой гарантии того, как автобокс реализован внутри.

Итак, теоретически, учитывая некоторый компилятор exoti c java, реализация может отличаться, как и производительность. Практически нет причин для реализации автобокс по-другому. Более того, если бы была лучшая реализация, она, вероятно, могла бы быть включена в Integer.valueOf(). Таким образом, даже в этом случае производительность будет одинаковой.


В Java, как правило, ничего не выиграет от использования альтернативной реализации, выполняющей то же самое. Например, раньше были различия в производительности между Arrays.copyOf и System.arraycopy, но AFAIK они были оптимизированы в Oracle / OpenJDK JVM.

...