Подтвердить что ты не робот

Различия между новым Integer (123), Integer.valueOf(123) и числом 123

Recenlty Я видел код (Java) следующим образом:

myMethod(new Integer(123));

В настоящее время я реорганизую некоторый код, и есть подсказка в инструменте Sonar, что более удобна память для использования sth следующим образом:

myMethod(Integer.valueOf(123));

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

myMethod(123);

Я мог бы понять, что, если бы я передал переменную методу, но жестко закодированный int? Или если будет Long/Double и т.д., И мне нужно длинное представление числа. Но целое?

4b9b3361

Ответ 1

new Integer(123) создаст новый экземпляр Object для каждого вызова.

В соответствии с javadoc, Integer.valueOf(123) имеет значение, он кэширует объекты... так что вы можете (или не можете) в конечном итоге с тем же Object если вы вызываете его более одного раза.

Например, следующий код:

   public static void main(String[] args) {

        Integer a = new Integer(1);
        Integer b = new Integer(1);

        System.out.println("a==b? " + (a==b));

        Integer c = Integer.valueOf(1);
        Integer d = Integer.valueOf(1);

        System.out.println("c==d? " + (c==d));

    }

Имеет следующий вывод:

a==b? false
c==d? true

Что касается использования значения int, вы используете примитивный тип (учитывая, что ваш метод также использует примитивный тип в своей сигнатуре) - он будет использовать немного меньше памяти и может быть быстрее, но вы не будете ale например, добавить его в коллекции.

Также обратите внимание на Java AutoBoxing, если ваша сигнатура метода использует Integer - при использовании JVM автоматически вызовет Integer.valueOf() для вас ( поэтому, используя кеш, также).

Ответ 2

public static Integer valueOf(int i)

Возвращает экземпляр Integer, представляющий указанное значение int. Если новый экземпляр Integer не требуется, этот метод должен обычно используются в предпочтении конструктору Integer (int), так как этот метод, вероятно, даст значительно лучшее пространство и время производительность путем кэширования часто запрашиваемых значений.

Параметры:
   i - значение int.
 Возвращает:
   a Экземпляр Integer, представляющий i.
 Так как:
   1.5

отсылайте http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#valueOf%28int%29

Этот вариант valueOf был добавлен в JDK 5 в Byte, Short, Integer и Long (он уже существовал в тривиальном случае в булевом языке с JDK 1.4). Все это, конечно же, неизменяемые объекты в Java. Раньше считалось, что если вам нужен объект Integer из int, вы создадите новый Integer. Но в JDK 5+, вам действительно нужно использовать valueOf, потому что Integer теперь кэширует объекты Integer между -128 и 127 и может передавать вам один и тот же точный объект Integer (0) каждый раз вместо того, чтобы тратить объект на совершенно новый идентичный объект Integer.

private static class IntegerCache {
private IntegerCache(){}

static final Integer cache[] = new Integer[-(-128) + 127 + 1];

static {
    for(int i = 0; i < cache.length; i++)
    cache[i] = new Integer(i - 128);
}
}

public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
    return IntegerCache.cache[i + offset];
}
    return new Integer(i);
}

refer Почему вы должны использовать Integer.valueOf(int)

ИЗМЕНИТЬ

autoboxing и создание объекта:

Важным моментом, который мы должны рассмотреть, является то, что autoboxing не уменьшает создание объекта, а снижает сложность кода. Хорошим правилом является использование примитивных типов, где нет необходимости в объектах по двум причинам:

Примитивные типы не будут медленнее, чем их соответствующие типы оберток, и могут быть намного быстрее. Могут быть некоторые неожиданные действия, связанные с == (сравнение ссылок) и .equals() (сравнить значения).

Обычно, когда примитивные типы вставляются в типы обертки, JVM выделяет память и создает новый объект. Но для некоторых особых случаев JVM повторно использует один и тот же объект.

Ниже приведен список примитивов, сохраненных как неизменяемые объекты:

  • логические значения true и false

  • Все значения байта

  • короткие значения между -128 и 127

  • значения int между -128 и 127

  • char в диапазоне от \u0000 до\u007F

отсылайте http://today.java.net/pub/a/today/2005/03/24/autoboxing.html#performance_issue

Ответ 3

int - это примитивный тип, а не объект.

new Integer(123) и Integer.valueOf(123) возвращают объект Integer, представляющий значение 123. Согласно javadoc для Integer.valueOf():

Возвращает экземпляр Integer, представляющий указанное значение int. Если новый экземпляр Integer не требуется, этот метод должен в общем случае следует использовать вместо конструктора Integer (int), так как этот метод вероятно, даст значительно лучшую производительность пространства и времени путем кэширования часто запрашиваемые значения.

Ответ 4

Требуется ли вашему методу int или Integer?

new Integer(int) и Integer.valueOf(int) возвращают объекты Integer, но valueOf должен быть предпочтительнее, поскольку он более эффективен, поскольку возвращает кэшированные объекты. Если для вашего метода требуется Integer, вы должны использовать Integer.valueOf.

Если для вашего метода требуется int, вы должны использовать int (например, 123).

Однако не обязательно строго соответствовать типам из-за autoboxing, который автоматически преобразует int в Integer и наоборот, если типы не совпадают. Это позволяет передать int в метод, требующий Integer, и Integer в метод, требующий int. Но имейте в виду, что есть затраты на производительность, связанные с автобоксированием. Самый распространенный пример использования автобоксинга - это если вы хотите хранить примитивы в коллекции.

Ответ 5

диапазон от -128 до +127 реализуется в кеше.

Integer a = new Integer(1);
 Integer b = new Integer(1);

 System.out.println("a==b? " + (a==b));

 Integer c = Integer.valueOf(127);
 Integer d = Integer.valueOf(127);

 System.out.println("c==d? " + (c==d)); 

 Integer e = Integer.valueOf(128);
 Integer f = Integer.valueOf(128);

 System.out.println("e==f? " + (e==f)); 

Обратитесь к этой спецификации java:

http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7

в JDK 5+, вы действительно должны использовать valueOf, потому что Integer теперь кэширует объекты Integer между -128 и 127 и может передавать вам один и тот же точный объект Integer (0) каждый раз вместо того, чтобы тратить объект на совершенно новую идентичную Integer объект.