不明白这个哈希映射增量语法

Don't understand this hash map increment syntax

h 是一个 Hash Map(泛型 Character,Integer)。 第一个示例有效,但第二个示例抛出错误结果(未正确递增)。为什么?

正确

if (h.containsKey(c)) {
        h.put(c, h.get(c)+1);
}
else {
        h.put(c, 1);
}

错误

if (h.containsKey(c)) {
        int value = h.get(c);
        h.put(c, value++);
}
else {
        h.put(c, 1);
}

您正在使用 post-increment,您的变量被传递给函数并且仅在此之后递增

 h.put(c, ++value);

这是预递增的语法,它在将变量传递给 get 调用之前递增变量

你真的在误用 ++。您不想增加变量,只想使用它的值加一:

h.pus(c, value + 1)

请注意,value++ 会增加 value,但 return 会增加其 原始 值,这就是您看到不同结果的原因。

虽然使用 ++value 也解决了问题,但它仍然是对 ++ 的误用。

使用 value++ 时,您将其传递给函数后分配给 value,因此使用的 value 变量将是递增之前的 value 变量。

在这种情况下,您将键 c 的相同值放入 hashmap,因为 value++ 将在函数 put 执行后计算。

if (h.containsKey(c)) {
        int value = h.get(c);
        h.put(c, value++); // should be h.put(c,++value) or h.put(c,value+1)
}
else {
        h.put(c, 1);
}

尝试使用 ++value 而不是 value+1

在java中有两种递增函数,一种是postfixprefix

postfix - value++ wll return value 和做增量操作

prefix - ++value 将进行递增操作,然后 return 递增值

相同的故事是递减

more details

preIncrement (++x)postIncrement (x++)不同。 而你正在使用第二个,它将在执行指令后立即更改 x 的值。 因此,在 h.put(c, value++); 行中,您将 value 放入 h 哈希映射,然后增加其值。

但是因为你想把value + 1加到hashmap中,你必须这样写:

h.put(c, ++value);

所以先增加value,然后放入HashMap