2016-09-14 62 views
0

在java.util.HashMap中,成員變量modCount似乎主要用於檢測併發修改。 那麼保持該變量爲int的需要是什麼,不能用bool實現呢?在java.util.HashMap中,爲什麼modcount不是布爾值?

+0

http://stackoverflow.com/questions/11833058/modcount-in-map-and-list modCount是地圖被修改的次數。至於是否可以用'boolean'完成同樣的事情......也許,但這是一個內部領域。只有JDK開發者才能提供真正的解釋。 – Tunaki

回答

5

修改計數而不是布爾值讓多個迭代器可以跟蹤它們是否有效。

如果使用布爾值跟蹤修改,那麼所有迭代器都需要處於相同的有效狀態。計數讓迭代器知道創建時發生了多少修改。因此,如果使用時的修改次數不同,則知道它是無效的。這允許一些迭代器是有效的,有些是無效的,所有這些都不需要手動更新每個迭代器的有效性。

2

如果你有一個布爾值,這意味着在調用迭代器之前,你必須將它設置爲false,當你完成時,你會檢查它是否是true,對吧?

但是,如果你這樣做了,並且你創建了兩個迭代器,或者創建了一個迭代器並調用了方法forEach,那麼第二個迭代器會重新設置該變量。現在

Iterator<K> keyIterator = map.keySet().iterator(); 
... 
keyIterator.next(); 
... 
map.put(key,value); 

Iterator<Map.Entry<K,V>> pairIterator = map.entrySet().iterator(); 
... 
keyIterator.next(); 

,以keyIterator.next()這最後調用應該失敗,因爲在中間map.put(key,value)通話。但是,如果我們通過重置布爾值來工作,那麼map.EntrySet().iterator()必須清除布爾標誌。因此,keyIterator.next()不會失敗。

使用整數可避免此問題,因爲沒有任何迭代器實際更改映射的狀態 - 只有修改操作纔會執行。保持「舊值」的變量保存在本地,因此不會干擾其他讀者。

相關問題