代码之家  ›  专栏  ›  技术社区  ›  463035818_is_not_an_ai

为什么我不能在地图中得到一个值的引用?[副本]

  •  -8
  • 463035818_is_not_an_ai  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我很困惑,在大多数情况下,所有的东西都是一个参考,但有时不是,和容器。考虑这段代码:

    HashMap<Integer,String> x_map = new HashMap<>();
    x_map.put(42,"foo");
    String g = x_map.get(42);
    g = "bar";
    System.out.println(g.equalsIgnoreCase(x_map.get(42)));
    

    为什么要印这个 false ?

    我找到了正确的方法: How to update a value, given a key in a java hashmap? 但是我完全不明白为什么上面的工作不能如预期那样工作。另外,当地图中的对象相当大时,我希望能够只修改地图中某个值的一个成员,而目前我不知道如何在不创建新实例并将其放入地图的情况下进行修改。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Zabuzard Louis-Philippe Lebouthillier    6 年前

    传递值

    Java是 传递值 (见 Is Java “pass-by-reference” or “pass-by-value”? )

    这意味着当你这样做的时候

    Person first = new Person("John");
    Person second = first;
    

    您有两个不同的变量,都指向实例 new Person("John") 在记忆中。但是,这两个变量都是 不同的 :

    first  ---|
              |---> new Person("John")
    second ---|
    

    如果操作对象本身,则更改 反映到两个变量 :

    second.setName("Jane");
    System.out.println(first.getName()); // Jane
    

    图表现在是:

    first  ---|
              |---> new Person("John").setName("Jane")
    second ---|
    

    但是如果你改变一个变量指向的地方,很明显 不影响其他变量 因为你没有接触他们指向的物体:

    second = new Person("Jane");
    System.out.println(first.getName()); // John
    

    在该语句之后,有两个变量指向不同的对象:

    first  ---> new Person("John")
    second ---> new Person("Jane")
    

    解释

    让我们把这些知识转移到您的代码中。你写道:

    String g = x_map.get(42);
    g = "bar";
    

    并且在问为什么 g = "bar" 不影响 地图存储的内容。

    如前所述,您只需更改变量 g 正在指向。你不能操纵地图内的物体。首先是图表:

         |---> x_map.get(42)
    g ---|
               "bar"
    

    然后

                x_map.get(42)
    g ---|
         |---> "bar"
    

    解决方案

    如果要更改对象,则需要直接对其进行操作,而不是只更改变量引用。喜欢 first.setName("Jane") . 然而,在Java中 String S是 不变的 . 意味着没有办法操纵 . 方法如 String#replace 不要操纵原始字符串,它们总是创建一个新的 对象并保持旧的不变。

    所以为了改变地图为他们存储的键 42 你只要用 Map#put 方法:

    x_map.put(42, "bar");
    

    这会改变什么 x_map 储存钥匙 四十二 "bar" .

        2
  •  0
  •   Mou    6 年前

    因为您没有更新x_映射中42键的值。 你应该这么做

    X轴地图放置(42,g)

        3
  •  0
  •   463035818_is_not_an_ai    6 年前

    原因见@khelwood的评论:

    变量由Java中的值赋值。G=x_图。仅获取(42) 将映射中的值赋给变量g。如果重新赋给g, 然后你将g重新输入一个不同的值。

    如果不是 String 我在地图中放置了一些实际可修改的内容,然后它按预期工作:

      public static class Test{
          public int x = 5;
      }
    

    然后。。。

    HashMap<Integer,Test> x_map = new HashMap<>();
    x_map.put(42,new Test());
    Test g = x_map.get(42);
    g.x = 12;
    System.out.println((g.x == x_map.get(42).x) + "  " + g.x + " " + x_map.get(42).x);
    

    印刷品 true 12 12 .