Ответ инструментария выше, правильный и лучший способ, но он не дает полного объяснения того, что происходит. Предполагая Java 5 или более поздней версии:
Integer a = new Integer(2); // or even just Integer a = 2;
a *= 10;
System.out.println(a); // will output 20
То, что вы должны знать, что это точно так же, как делают:
Integer a = new Integer(2); // or even just Integer a = 2;
a = a.intValue() * 10;
System.out.println(a.intValue()); // will output 20
При выполнении операции (в данном случае * =) на объекте 'a', вы не изменяете значение int внутри объекта 'a', но фактически назначаете новый объект 'a'. Это связано с тем, что «a» получает автоматическое распаковку, чтобы выполнить умножение, а затем результат умножения автоматически присваивается и присваивается «a».
Целое - неизменный объект. (Все классы-оболочки неизменны.)
Возьмем, к примеру, этот кусок кода:
static void test() {
Integer i = new Integer(10);
System.out.println("StartingMemory: " + System.identityHashCode(i));
changeInteger(i);
System.out.println("Step1: " + i);
changeInteger(++i);
System.out.println("Step2: " + i.intValue());
System.out.println("MiddleMemory: " + System.identityHashCode(i));
}
static void changeInteger(Integer i) {
System.out.println("ChangeStartMemory: " + System.identityHashCode(i));
System.out.println("ChangeStartValue: " + i);
i++;
System.out.println("ChangeEnd: " + i);
System.out.println("ChangeEndMemory: " + System.identityHashCode(i));
}
Выход будет:
StartingMemory: 1373539035
ChangeStartMemory: 1373539035
ChangeStartValue: 10
ChangeEnd: 11
ChangeEndMemory: 190331520
Step1: 10
ChangeStartMemory: 190331520
ChangeStartValue: 11
ChangeEnd: 12
ChangeEndMemory: 1298706257
Step2: 11
MiddleMemory: 190331520
Вы можете увидеть адрес памяти для «Я» (адреса вашей памяти будут разными).
Теперь давайте сделаем небольшой тест с отражением, добавьте это в конец метода испытаний():
System.out.println("MiddleMemory: " + System.identityHashCode(i));
try {
final Field f = i.getClass().getDeclaredField("value");
f.setAccessible(true);
f.setInt(i, 15);
System.out.println("Step3: " + i.intValue());
System.out.println("EndingMemory: " + System.identityHashCode(i));
} catch (final Exception e) {
e.printStackTrace();
}
Дополнительный выход будет:
MiddleMemory: 190331520
Step2: 15
MiddleMemory: 190331520
Вы можете видеть, что адрес памяти для «i» не изменился, хотя мы изменили его значение с помощью отражения.
(НЕ ИСПОЛЬЗУЙТЕ ОТРАЖЕНИЕ ЭТОТ ПУТЬ В РЕАЛЬНОЙ ЖИЗНИ !!)
Я также советую вам проверить, действительно ли используется Integer. Джошуа указал, что использование примитивов в МЕНЬШЕ МНОГИЕ быстрее в Эффективной Java. Итак, если вы можете, придерживайтесь ** int **. – 2008-09-05 15:54:56
Использование Integer на самом деле является конструктивным ограничением. Идея заключается в том, что я получаю объект Integer, и я должен его обновить. Итак, не могу покончить с этим :) – Jagmal 2008-09-05 17:40:24