对于参数类型int,AtomicLong,运算符+ =未定义

时间:2013-02-08 08:00:27

标签: java atomic-long

我的地图如下 -

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而不是LongAtomicLong

所以我需要找到如何在下面的代码中进行更改,以便它开始工作。我正在考虑转向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);
    }

}

1 个答案:

答案 0 :(得分:4)

+=运算符最初打算用于原始数据类型(intlong ...)。由于这些不能放在映射中,因此存在包装类。当您对任何算术运算符使用IntegerLong时,它们会自动“取消装箱”到相应的基本类型。

但是,没有与任何AtomicXYZ对应的原始类型。但是,您可以使用Number类提供的任何方法将其值作为基元,例如longValue()intValue()。请注意,原子长度的值原则上可以大于最大int(或Integer),因此您可能希望以某种方式处理潜在的溢出。

[edit]或者您可以使用get()方法作为assylias指出(我之前从未使用过原子类型,因此我没有注意到),这与longValue()的作用相同AtomicLong(与intValue()的{​​{1}}相同),从其实现中可以看出。