Возвращает ли 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);

Ответ 4

Результат присваивания

balance = 10;

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

Если вам нужно изменить значение баланса, вы должны обернуть его в изменяемый класс, как aioobe описывает.