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

Stuart Marks stuart.marks at oracle.com
Fri May 17 03:42:35 UTC 2019

Hi Alan,

Whether you call them "ersatz" collections, "non-standard" collections, or 
collections with different membership semantics, they have been around in the 
collections framework from day one. This is perhaps unfortunate, and it may be 
considered to be bad design, but it is a fact.

The issue is not with undefined or implementation-specific behavior. The issue 
is that the specification as it stands is self-contradictory. In particular, it 
assumes that certain operations are symmetric that in fact are not, if you read 
other parts of the spec and derive logical conclusions from them. This is what 
I'm trying to fix. This is not a mere a matter of intellectual consistency. This 
state of affairs has real consequences. There is a whole family of bugs linked 
to this one which complain both about the performance issue and the semantic 
issue. All of these bugs are directly related to the self-contradictory nature 
of the current specification. With my changes, the spec is self-contradictory in 
fewer places. (There is, however, more work to be done; see JDK-8190545.)

Your lead point, though, is about performance. The performance optimization of 
AbstractSet.removeAll is one of those that assumes that the operation is 
symmetric, when in fact it isn't. As a rule, optimizations mustn't change 
semantics. Therefore, it has to go.


More information about the core-libs-dev mailing list