RFR [8005953] Speedup construction of CopyOnWriteArraySet in special cases (original) (raw)

Ivan Gerasimov ivan.gerasimov at oracle.com
Tue Apr 30 13:29:48 UTC 2013


Thanks, Jason!

The addAllAbsent() function has O(c.length^2) complexity, so construction time quickly grows with the input size. However, if we knew that c is a Set, we could construct the COWAS in linear time. You have to be able to prove that the given Set uses the same equivalence relation as the COWAS. Otherwise, it will fall apart you pass a SortedSet with a Comparator or an identity set.

I relied on what the documentation [1] says: "sets contain no pair of elements e1 and e2 such that e1.equals(e2)". Further, [2] states: "the ordering maintained by a sorted set (whether or not an explicit comparator is provided) must be consistent with equals if the sorted set is to correctly implement the Set interface"

However you're right that if a class derived from Set is implemented inconsistently with equals (even though the documentation says it should not), the behavior of the constructor will change.

[1] http://docs.oracle.com/javase/7/docs/api/java/util/Set.html [2] http://docs.oracle.com/javase/7/docs/api/java/util/SortedSet.html

Sincerely, Ivan

And if the c was known to be another COWAS, we could simply clone the underlying CopyOnWriteArrayList. That would be safe. Jason



More information about the core-libs-dev mailing list