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

Mer*_*rni 16 java reference hashmap

我有一个HashMap:

private HashMap<String, Integer> cardNumberAndCode_ = new HashMap<String, Integer>();
Run Code Online (Sandbox Code Playgroud)

后来我这样做:

Integer balance = cardNumberBalance_.get(cardNumber);
System.out.println(balance);
balance = 10;
Integer newBalance = cardNumberBalance_.get(cardNumber);
System.out.println(newBalance);
Run Code Online (Sandbox Code Playgroud)

首先它打印1000,第二次打印1000,值不变.为什么java按值而不是通过引用返回Integer?

aio*_*obe 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());
Run Code Online (Sandbox Code Playgroud)

但你可能想要做这样的事情:

cardNumberBalance_.put(cardNumber, 10);
Run Code Online (Sandbox Code Playgroud)

  • 你不能这样做......你必须将余额包装在一个单独的可变类中......还要注意`Integer`是一个*不可变的*类. (2认同)