有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么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

我希望它打印两个数字(如果我修改引用的话)或两个零(如果我修改值的话)。那么,为什么从整数到整数的映射行为与从整数到事物的映射行为不同呢


共 (4) 个答案

  1. # 1 楼答案

    通过i=i+1,您不是在增加存储在java中的值。lang.包含在映射中的整数

  2. # 2 楼答案

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

  3. # 3 楼答案

    我想我=我+1;不会在对象上更新,因为在指定给基元时,get将是值的副本。因此,原语更新不会反映在地图中,因为您不持有引用。在Thing中的下一个示例中,您将直接分配回Thing的public原语,因此再次使用值-但您将更新public int

  4. # 4 楼答案

    回答问题的第二部分(“那么为什么它在第二个打印语句上打印1?”),这是因为台词

    Thing t = tmap.get(0);
    t.a = t.a + 1;
    

    。。。获取对位于hashmap中给定位置的对象的引用,然后修改引用对象的成员变量。然后,println语句使用现在修改的成员变量检索对同一对象的另一个引用