Java:在ConcurrentHashMap中,为什么在更改密钥时会有不同的输出

0 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

ONE : 1
FOUR : 4
TWO : 2
THREE : 3
SEVEN : 7
Run Code Online (Sandbox Code Playgroud)

更改密钥后的第二次迭代

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);
        }           
    }
} 
Run Code Online (Sandbox Code Playgroud)

输出是:

ONE : 1
FOUR : 4
TWO : 2
THREE : 3
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么第一次迭代包括SEVEN作为输出而不是第二次迭代中的FIVE?

Jim*_*son 6

Javadoc(我强调):

类似地,Iterators,Spliterators和Enumerations 在迭代器/枚举的创建时或之后的某个时刻返回反映哈希表状态的元素.

换句话说,迭代器可用的视图没有任何保证.创建后,它可能会或可能不会知道对地图的更改Iterator.唯一的保证是

它们不会抛出ConcurrentModificationException.