Возвращает ли Java по ссылке или по значению
У меня есть HashMap:
private HashMap<String, Integer> cardNumberAndCode_ = new HashMap<String, Integer>();
И позже я делаю это:
Integer balance = cardNumberBalance_.get(cardNumber);
System.out.println(balance);
balance = 10;
Integer newBalance = cardNumberBalance_.get(cardNumber);
System.out.println(newBalance);
Сначала его отпечатки 1000, а во второй раз его печать 1000, значение не изменяется. Почему Java возвращает Integer по значению, а не по ссылке?
Ответы
Ответ 1
Метод get
возвращает копию ссылки на сохраненное целое число...
Назначение нового значения переменной, хранящей эту копию, указывает на значение 10
, не изменит ссылку на карте.
Это сработает, если вы можете сделать balance.setValue(10)
, но поскольку Integer
- неизменяемый класс, это не вариант.
Если вы хотите, чтобы изменения повлияли на карту, вам придется обернуть баланс в (изменяемом) классе:
class Balance {
int balance;
...
}
Balance balance = cardNumberBalance_.get(cardNumber);
System.out.println(balance.getBalance());
balance.setBalance(10);
Balance newBalance = cardNumberBalance_.get(cardNumber);
System.out.println(newBalance.getBalance());
Но вы, вероятно, захотите сделать что-то вроде этого:
cardNumberBalance_.put(cardNumber, 10);
Ответ 2
Переменная Integer содержит ссылку на объект. Объект Integer неизменен, и вы не можете его изменить. Когда вы выполняете
balance = 10; // replace the previous Integer reference with a different one.
Обычный способ сделать это - использовать
cardNumberBalance_.put(cardNumber, 10);
Альтернативой, которая не используется так часто, является использование AtomicInteger или использование собственного MutableInteger
private final Map<String, AtomicInteger> cardNumberAndCode_ = new HashMap<String, AtomicInteger>();
AtomicInteger balance = cardNumberBalance_.get(cardNumber);
balance.set(10);
Ответ 3
Java не поддерживает передачу по ссылке (и обратную ссылку). См. Является ли Java "pass-by-reference" " или "пропуск по значению" ,
Ответ 4
Результат присваивания
balance = 10;
заключается в том, что создается новый экземпляр Integer
со значением 10, а его ссылка присваивается переменной balance
. Он не изменяет объект, который вы получаете с карты, то есть объект, сохраненный на карте, не изменяется.
Если вам нужно изменить значение баланса, вы должны обернуть его в изменяемый класс, как aioobe описывает.