3

我有一张地图如下 -

ConcurrentHashMap<Long, AtomicLong> histogram = new ConcurrentHashMap<Long, AtomicLong>();

该映射包含很多键值对。将AtomicLong值作为值是必要的,所以这就是我在该地图中放置这样的原因。

所以现在如果我试图遍历ConcurrentHashMap我上面提到的,它总是在这条线上给我错误-

buckets[i] += histogram.get(time);

作为-The operator += is undefined for the argument type(s) int, AtomicLong

我不确定如何解决此问题?我无法返回并将数据结构更改为 allInteger而不是Longand AtomicLong

所以我需要找出如何在下面的代码中进行更改,以便它开始工作。我正在考虑转换为整数。但它也没有工作。

下面是我的代码

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);
    }

}
4

1 回答 1

5

+=运算符最初旨在与原始数据类型 ( int, long...) 一起使用。由于这些不能放在地图中,因此存在包装类。当您将IntegerorLong与任何算术运算符一起使用时,它们会自动“拆箱”为相应的原始类型。

但是,没有对应于 any 的原始类型AtomicXYZ。但是,您可以使用Number该类提供的任何方法来获取其原始值,例如longValue()intValue()。请注意,您的 atomic long 的值原则上可以大于最大值int(或Integer),因此您可能希望以某种方式处理潜在的溢出。

[编辑] 或者您可以使用get()assylias 指出的方法(我不知道,因为我以前从未使用过原子类型),它与longValue()for AtomicLong(和intValue()for AtomicInteger)做同样的事情,可以看出从其实施。

于 2013-02-08T08:05:30.807 回答