Nim*_*sky 29 java pointers reference hashmap
我是否必须返回该对象然后再添加一个新对象?或者我可以直接增加?
Integer temp = myMap.get(key);
temp++;
myMap.put(key, temp);
Run Code Online (Sandbox Code Playgroud)
没有办法做到这一点(这不起作用):
myMap.get(key)++;
Run Code Online (Sandbox Code Playgroud)
Ale*_*exR 24
这是完成这项工作的最短代码.
myMap.put(key, myMap.get(key) + 1)
Run Code Online (Sandbox Code Playgroud)
我认为不会太久.
Pet*_*rey 20
您可以使用可变整数,例如AtomicInteger.
Map<Key, AtomicInteger> myMap = new HashMap<Key, AtomicInteger>();
myMap.get(key).incrementAndGet();
Run Code Online (Sandbox Code Playgroud)
或者您可以使用支持集合中的基元的Trove4j.
TObjectIntHashMap<Key> myMap;
myMap.increment(key);
Run Code Online (Sandbox Code Playgroud)
Jon*_*nen 20
在Java 8中,有一些新方法Map可以与lambdas一起使用来解决这个问题.第一种选择,compute:
a.compute(key, (k, v) -> v+1);
Run Code Online (Sandbox Code Playgroud)
请注意,这仅在为所有可能的键初始化哈希时才有效.
如果无法保证,您可以将上述代码更改为:
a.compute(key, (k, v) -> v == null ? 1 : v + 1);
Run Code Online (Sandbox Code Playgroud)
或者使用merge方法(我更喜欢):
a.merge(key, 1, (a, b) -> a + b);
Run Code Online (Sandbox Code Playgroud)
也许有更多基于lambda的方法,我不知道.
Mic*_*rdt 14
我是否必须返回该对象然后再添加一个新对象?
只要你使用Integer包装类是的,因为它是不可变的.你可以使用一个可变的包装类,即使是一个有increment()方法的包装类.但是,您失去了对值使用自动装箱和自动装箱的能力.
你不能直接递增它,因为它是不可变的.你必须增加它并将新对象放回去.
自动拳击也在这里干扰.实际上发生的事情类似于:
Integer i1 = getFromMap();
i1 = Integer.valueOf(++ i1.intValue());
Run Code Online (Sandbox Code Playgroud)
所以这里你的参考指向一个新对象.您必须将该对象放回到地图中,在同一个键下.