【问题标题】:Assigning to return value of HashMap get分配给HashMap get的返回值
【发布时间】:2015-12-01 17:32:03
【问题描述】:

为什么下面最后一行代码在 Java 中不能编译?

HashMap<String, Integer> map = new HashMap();
map.put("a", 1);
map.get("a") += 1;

类似的东西适用于 C++。

【问题讨论】:

    标签: java reference hashmap variable-assignment


    【解决方案1】:

    您正在尝试使用 get 方法更改地图值。在您的代码中,map.get("a"); 只会 RETURN 一个整数。如果不使用 setter 方法.put(),则无法更改存储在 HashMap 对象中的 Integer 的值 这样的事情是可以接受的:

    map.put("a",1);
    map.put("a",map.get("a") + 1);
    

    但是,这个:

    map.get("a") += 1;
    

    不可接受且不会编译,因为您无法通过 getter 方法更改对象的值。

    map.put()map.get() 等getter 和setter 方法在Java 中如此重要的原因可以在here 中找到

    【讨论】:

    • 我知道我可以通过你提到的方法改变地图中的值。但我感兴趣的是什么 Java 语言约束实际上禁止了这种表达式。我认为答案是map.get() 返回一个不可变的Integer
    • 约束在上面提到。您不能使用 getter 方法更改该值。实际更改映射中值的唯一方法是使用 setter 方法,因为您只能通过预定义的方法访问存储在映射中的 Integer 对象。 java 编译器假定您正在尝试更改 Integer 对象的值并使用相同的 map.get 语句将该新值存储在映射中,这就是您收到编译器错误的原因
    【解决方案2】:

    map.get 得到的结果是一个Integer 对象。而那些 Integer 对象不支持 += 运算符(正如您从 C++ 中所知道的那样),因为您通常不能在 Java 中重载运算符。 相反,您必须使用 map.put 函数再次将其放入地图中。 请注意,Integer 对象与内置的 int 类型不同!

    【讨论】:

    • 实际上,这确实有效,并且符合您的预期。
    • 由于自动拆箱和自动装箱,您“不起作用”的代码确实有效。问题与这里的整数运算无关——你不能分配给方法的返回值。
    • 是的,你们两个是对的。我仍然打开了一些其他编译器标志来阻止自动装箱。我很抱歉...
    【解决方案3】:

    类似的东西适用于 C++。

    Java 不是 C++,所以你不应该期望在 C++ 中有效的东西在 Java 中同样有效。

    如果要更新存储在地图中某个键下的值,则必须使用新值再次将其放入地图中,这将替换旧值。例如:

    Map<String, Integer> map = new HashMap<>();
    map.put("a", 1);
    
    // Get the value stored under "a", add one and store the new value
    map.put("a", map.get("a") + 1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      相关资源
      最近更新 更多