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?


问题答案:

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