Java 是按引用还是按值返回

2022-09-02 10:24:43

我有一个哈希地图:

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);

首先它打印,第二次它打印,这个值不会改变。为什么 Java 按值而不是按引用返回 Integer?10001000


答案 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);