Различия между новым Integer (123), Integer.valueOf(123) и числом 123
Recenlty Я видел код (Java) следующим образом:
myMethod(new Integer(123));
В настоящее время я реорганизую некоторый код, и есть подсказка в инструменте Sonar, что более удобна память для использования sth следующим образом:
myMethod(Integer.valueOf(123));
Однако в этом случае я думаю, что нет никакой разницы, если я буду использовать:
myMethod(123);
Я мог бы понять, что, если бы я передал переменную методу, но жестко закодированный int? Или если будет Long/Double и т.д., И мне нужно длинное представление числа. Но целое?
Ответы
Ответ 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 объект.