为什么Java的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;
}
}
打印出以下内容:
0
1
我希望它打印两个数字(如果我修改引用的话)或两个零(如果我修改值的话)。那么,为什么从整数到整数的映射行为与从整数到事物的映射行为不同呢
# 1 楼答案
通过i=i+1,您不是在增加存储在java中的值。lang.包含在映射中的整数
# 2 楼答案
Java的整数类型是不可变的,因此第一个示例从映射中获取值,然后用新值替换局部变量。但是,第二个示例从映射中获取对Thing实例的引用
# 3 楼答案
我想我=我+1;不会在对象上更新,因为在指定给基元时,get将是值的副本。因此,原语更新不会反映在地图中,因为您不持有引用。在Thing中的下一个示例中,您将直接分配回Thing的public原语,因此再次使用值-但您将更新public int
# 4 楼答案
回答问题的第二部分(“那么为什么它在第二个打印语句上打印1?”),这是因为台词
。。。获取对位于hashmap中给定位置的对象的引用,然后修改引用对象的成员变量。然后,println语句使用现在修改的成员变量检索对同一对象的另一个引用