Java是通过引用还是按值返回

时间:2011-09-04 07:38:04

标签: java reference hashmap

我有一个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?

4 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:2)

Integer变量包含对Object的引用。 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);

答案 2 :(得分:1)

Java不支持pass-by-reference(并且通过引用返回)。见Is Java "pass-by-reference" or "pass-by-value"?

答案 3 :(得分:1)

作业结果

balance = 10;

是创建Integer的新实例,其值为10,其引用分配给balance变量。它不会更改从地图中获取的对象,即存储在地图中的对象不会更改。

如果您需要更改余额值,则必须将其包装在可变类中,就像aioobe describes一样。