Java : In ConcurrentHashMap , 如果我更改 key ,为什么会有不同的输出

标签 java collections concurrenthashmap

第一次迭代:-

class ConcurrentHashMapBehaviour
{       
    public static void main(String[] args) 
    {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
        map.put("ONE", 1);
        map.put("TWO", 2);
        map.put("THREE", 3);
        map.put("FOUR", 4);
        Iterator<String> it = map.keySet().iterator();
        while (it.hasNext()){
            String key = (String) it.next();
            System.out.println(key+" : "+map.get(key));
            map.put("SEVEN", 7);
        }
    }
}

输出是:

ONE : 1
FOUR : 4
TWO : 2
THREE : 3
SEVEN : 7

更改 key 后的第二次迭代

class ConcurrentHashMapBehaviour
{       
    public static void main(String[] args) 
    {
        ConcurrentHashMap<String, Integer> map = new 
        ConcurrentHashMap<String, Integer>();

        map.put("ONE", 1);
        map.put("TWO", 2);
        map.put("THREE", 3);
        map.put("FOUR", 4);
        Iterator<String> it = map.keySet().iterator();
        while (it.hasNext()){
            String key = (String) it.next();
            System.out.println(key+" : "+map.get(key));
            map.put("FIVE", 5);
        }           
    }
} 

输出是:

ONE : 1
FOUR : 4
TWO : 2
THREE : 3

所以我的问题是为什么第一次迭代包含 7 作为输出,但在第二次迭代中不包含 5?

最佳答案

Javadoc(我强调):

Similarly, Iterators, Spliterators and Enumerations return elements reflecting the state of the hash table at some point at or since the creation of the iterator/enumeration.

换句话说,对于迭代器可用的 View 没有任何保证。在创建 Iterator 之后,它可能会或可能不会意识到映射的更改。唯一的保证是

They do not throw ConcurrentModificationException.

关于Java : In ConcurrentHashMap , 如果我更改 key ,为什么会有不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49358037/

相关文章:

java - 通过socket从objective-c发送一个int到java,但是java端的值改变了

java - 如何将ResultSet对象转换为ArrayList

java - 在java中哪个循环最适合迭代集合

Java 并发 : Volatile vs final in "cascaded" variables?

java - 简单的 Java GUI 作为弹出窗口和下拉菜单

java - 如果发生错误,IO 线程向 GUI 线程发出警报

java - 以原子方式递增存储在 ConcurrentHashMap 中的计数器

java - 关于java中的双键并发hashmap

java - 如何在 Java 中使用父目录中的类?

java - 按需将数据从文件加载到集合的最有效方法是什么?