RFR (M): JDK-6394757: AbstractSet.removeAll semantics are surprisingly dependent on relative sizes

Stuart Marks stuart.marks at oracle.com
Wed May 8 23:07:24 UTC 2019



On 5/7/19 4:33 PM, Brent Christian wrote:
> Collection.java:
> 
>   110  * that use different membership semantics. For operations that involve 
> more than
>   111  * one collection, it is specified which collection's membership semantics 
> are
>   112  * used by the operation.
> 
> addAll() and copyOf() involve more than one collection, though I agree that they 
> do not need to be updated to specify membership semantics.

Yeah. Maybe I can be more specific here... operations that involve membership in 
both collections, or something.

> AbstractCollection.java:
> 
> 
> 404 * obtaining an iterator from the {@code iterator} method. Each element
> 405 * is passed to the {@code contains} method of the specified collection.
> 406 * If this call returns {@code false}, the element is removed from
>           ^^^^^^^^^
> 
> Is "this call" a little ambiguous?  Maybe:
> 
> "If contains() returns false..."
> or
> "If false is returned..."
> 
> ?

Yeah I agree it's a bit clumsy. I'll tweak it to be better.

> List.java:
> 
> Should containsAll(), removeAll(), retainAll() have the @implNote about 
> contains() performance?

Good question.

I started to go and add them, but then I thought that it didn't make sense. 
List.contains() is almost unavoidably linear in performance -- at least our 
built-in List implementations are -- so the note on containsAll() is mostly 
pointless.

However, the bulk removals (removeAll and retainAll) on ArrayList are optimized 
to make a single pass over the list elements (i.e., they don't do repeated 
copying) so the performance of contains() on the specified collection is indeed 
relevant. I'll add the notes to those methods.

s'marks


More information about the core-libs-dev mailing list