我有一张来自
的地图Map<Character, Integer> tmp;
在我的代码中的某些时候,我会执行以下操作:
if(tmp.containsKey(key))
tmp.put(key, tmp.get(key)+1)
在第二行中,我更愿意做一些像
这样的事情 tmp.get(key)++;
我期望工作,因为我应该从get-call获得对Integer对象的引用。但事实并非如此,除了int语法之外,Integer似乎没有更新功能。围绕第一个构造没有办法吗?
答案 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();