RFR : 8016446 : (m) Add override forEach/replaceAll to HashMap, Hashtable, IdentityHashMap, WeakHashMap, TreeMap

Paul Sandoz paul.sandoz at oracle.com
Thu Jun 13 14:47:00 UTC 2013

On Jun 13, 2013, at 4:06 PM, Remi Forax <forax at univ-mlv.fr> wrote:
>>> There is a difference between an Iterator/forEach and a spliterator/stream,
>>> with a stream you know that the called lambdas will not interfere and mutate the source collection.
>> You do? I don't think there is any conceptual difference between the following w.r.t. interference:
>>   ArrayList l = ...
>>   l.stream().filter(...).forEach(e -> l.add(e));
>>   l.spliterator().forEachRemaining(e -> l.add(e));
>> and:
>>   ArrayList l = ...
>>   l.forEach(e -> l.add(e));
>>   l.iterator().forEachRemaining(e -> l.add(e));
>> Of course we have (or will have) strong wording saying don't implement interfering lambdas, but we still have to check for co-modification in the traversal methods of ArrayList spliterator.
> Isn't it because if you remove an element from an ArrayList while iterating you can see a stale value ?
> While with a HashMap, if you have only one thread, you can not see a stale entry ?

Assuming just one thread do you agree that in all of the above examples the only way the list can be interfered with is by the Consumer instance e -> l.add(s) ?

> So a spliterator on HashMap can only check the modCount at the end unlike the one on ArrayList that need to check at each step.

The ArrayList.spliterator.forEachRemaining implementation also checks at the end.


More information about the core-libs-dev mailing list