我的地图如下 -
ConcurrentHashMap<Long, AtomicLong> histogram = new ConcurrentHashMap<Long, AtomicLong>();
此地图包含大量键值对。将AtomicLong
作为值是必要的,这就是我在该地图中放置这样的原因。
所以现在如果我试图迭代上面提到的ConcurrentHashMap
,它总是在这一行上给我错误 -
buckets[i] += histogram.get(time);
as- The operator += is undefined for the argument type(s) int, AtomicLong
我不确定如何解决这个问题?我无法返回并将数据结构更改为所有Integer
而不是Long
和AtomicLong
。
所以我需要找到如何在下面的代码中进行更改,以便它开始工作。我正在考虑转向Integer。但它也没有用。
以下是我的代码
private static void logHistogramInfo() {
System.out.println("From Main Thread: " + histogram);
int[] definition = { 0, 20, 40, 60, 80, 100 };
int[] buckets = new int[definition.length];
for (Long time : histogram.keySet()) {
for (int i = definition.length - 1; i >= 0; i--) {
if (time >= definition[i]) {
//error on the below line
buckets[i] += histogram.get(time);
break;
}
}
}
for (int i = 0; i < definition.length; i++) {
String period = "";
if (i == definition.length - 1) {
period = "greater than " + definition[i] + "ms";
} else {
period = "between " + (definition[i] + 1) + " and " + definition[i + 1] + "ms";
}
System.out.println(buckets[i] + " came back " + period);
}
}
答案 0 :(得分:4)
+=
运算符最初打算用于原始数据类型(int
,long
...)。由于这些不能放在映射中,因此存在包装类。当您对任何算术运算符使用Integer
或Long
时,它们会自动“取消装箱”到相应的基本类型。
但是,没有与任何AtomicXYZ
对应的原始类型。但是,您可以使用Number
类提供的任何方法将其值作为基元,例如longValue()
或intValue()
。请注意,原子长度的值原则上可以大于最大int
(或Integer
),因此您可能希望以某种方式处理潜在的溢出。
[edit]或者您可以使用get()
方法作为assylias指出(我之前从未使用过原子类型,因此我没有注意到),这与longValue()
的作用相同AtomicLong
(与intValue()
的{{1}}相同),从其实现中可以看出。