为什么Java的HashMap对不同的对象有不同的行为?

0 java reference hashmap

我有以下使用HashMap和泛型的Java代码:

import java.util.*;
import java.io.*;

public class Map{
    static HashMap<Integer, Integer> imap;
    static HashMap<Integer, Thing> tmap;

    public static void main(String[] args){

        imap = new HashMap<Integer, Integer>();
        imap.put(0,0);
        Integer i = imap.get(0);
        i = i + 1;
        System.out.println(imap.get(0));

        tmap = new HashMap<Integer, Thing>();
        tmap.put(0,new Thing(0));
        Thing t = tmap.get(0);
        t.a = t.a + 1;
        System.out.println(tmap.get(0).a);
    }
}

class Thing{
    public int a;
    public Thing(int n){
        this.a = n;
    }
}
Run Code Online (Sandbox Code Playgroud)

打印出以下内容:

0
1
Run Code Online (Sandbox Code Playgroud)

我希望它打印两个(如果我正在修改引用)或两个零(如果我正在修改值).那么为什么从整数到整数的映射的行为不同于从整数到事物的行为?

E.B*_*oît 5

Java的整数类型不可变,因此您的第一个示例从地图中获取值,然后使用新值替换局部变量.但是,第二个示例从地图获取对Thing实例的引用.

  • 实际上,对象是否是不可变的并不重要.如果你做了`X x = map.get(0); x = somethingElse;`,如果`X`是不可变的并不重要.您正在重新分配一个局部变量,该变量不会改变原始'x`的任何内容. (4认同)