如何增加一个Integer-lvalue

时间:2014-04-01 17:44:53

标签: java map integer

我有一张来自

的地图
Map<Character, Integer> tmp;

在我的代码中的某些时候,我会执行以下操作:

if(tmp.containsKey(key))
    tmp.put(key, tmp.get(key)+1)

在第二行中,我更愿意做一些像

这样的事情
    tmp.get(key)++;

我期望工作,因为我应该从get-call获得对Integer对象的引用。但事实并非如此,除了int语法之外,Integer似乎没有更新功能。围绕第一个构造没有办法吗?

4 个答案:

答案 0 :(得分:6)

由于Integer类对象是不可变的,因此您无法对其进行修改。您必须将结果放回地图中。一种选择是使用像AtomicInteger这样的可变值:

Map<Character, AtomicInteger> tmp;
tmp.get(ch).incrementAndGet();

答案 1 :(得分:4)

基元不适用于泛型,因此您必须使用Integer个对象而不是int个值。

你不能使用这个

tmp.get(key)++;

因为它被翻译成类似

的东西
Integer value = tmp.get(key);
int intValue = value.intValue();
value = Integer.valueOf(intValue += 1); // different Integer reference now stored in value

所以你看,tmp中的引用保持不变。

您目前的做法是正确的。或者使用包含增量操作的类来执行Rohit建议的内容,例如AtomicInteger

答案 2 :(得分:1)

抱歉,但没有Integer包装类。包装器对象是不可变的,因此您实际上在那里获得了新的引用。考虑一下这段代码,

Integer i = 1;
Integer j = i;
System.out.printf("i=%d, j=%d, i == j is %b\n", i, j, i == j);
++i;
System.out.printf("i=%d, j=%d, i == j is %b\n", i, j, i == j);

您会注意到i的增量对j没有影响。

答案 3 :(得分:0)

您可以使用具有递增和递减功能的AtomicInteger

if(tmp.containsKey(key))
    tmp.get(key).incrementAndGet();