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

我有一个HashMap:

private HashMap cardNumberAndCode_ = new HashMap(); 

后来我这样做:

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

Integer变量包含对Object的引用。 Integer对象是不可变的,您无法更改它。 当你表演

 balance = 10; // replace the previous Integer reference with a different one. 

正常的方法是使用

 cardNumberBalance_.put(cardNumber, 10); 

不经常使用的替代方法是使用AtomicInteger或使用您自己的MutableInteger

 private final Map cardNumberAndCode_ = new HashMap(); AtomicInteger balance = cardNumberBalance_.get(cardNumber); balance.set(10); 

Java不支持pass-by-reference(并且通过引用返回)。 请参阅Java是“传递引用”还是“按值传递”?

作业的结果

 balance = 10; 

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

如果你需要改变balance的值,你必须像aioobe描述的那样将它包装在一个可变类中 。