JDK java.util.concurrent.ConcurrentSkipListSet.equals(Object o) implementation efficiency
Martin Buchholz
martinrb at google.com
Fri May 26 16:45:18 UTC 2017
Thanks for the suggestion!
I filed https://bugs.openjdk.java.net/browse/JDK-8181146
On Fri, May 26, 2017 at 7:21 AM, Tenghuan He <tenghuanhe at gmail.com> wrote:
> Hi, all
>
> I found that the equalsimplementation of
> java.util.concurrent.ConcurrentSkipListSet in JDK as follows:
>
> public boolean equals(Object o) {
> // Override AbstractSet version to avoid calling size()
> if (o == this)
> return true;
> if (!(o instanceof Set))
> return false;
> Collection<?> c = (Collection<?>) o;
> try {
> return containsAll(c) && c.containsAll(this);
> } catch (ClassCastException unused) {
> return false;
> } catch (NullPointerException unused) {
> return false;
> }}
>
>
> Since ConcurrentSkipListSet extends NavigableSet which extends SortedSet,
> the following equalsimplementation seems more reasonable for a compare
> object which also extends SortedSet.
>
> public boolean myEquals(Object o) {
> // Override AbstractSet version to avoid calling size()
> if (o == this)
> return true;
> if (!(o instanceof Set))
> return false;
> if (o instanceof SortedSet) {
> Iterator iter1 = ((SortedSet) o).iterator();
> Iterator iter2 = iterator();
>
> while (iter1.hasNext() && iter2.hasNext()) {
> if (!iter1.next().equals(iter2.next())) {
> return false;
> }
> }
> return !(iter1.hasNext() || iter1.hasNext());
> }
> Collection<?> c = (Collection<?>) o;
> try {
> return containsAll(c) && c.containsAll(this);
> } catch (ClassCastException unused) {
> return false;
> } catch (NullPointerException unused) {
> return false;
> }
> }
>
> A simple test has shown the performance improvement
>
> public class Test {
> public static void main(String[] args) {
> ConcurrentSkipListSet<Integer> set1 = new
> ConcurrentSkipListSet<Integer>();
> ConcurrentSkipListSet<Integer> set2 = new
> ConcurrentSkipListSet<Integer>();
>
> for (int i = 0; i < 10000000; i++) {
> set1.add(i);
> set2.add(i);
> }
>
> long ts = System.currentTimeMillis();
> System.out.println(set1.equals(set2));
> System.out.println(System.currentTimeMillis() - ts);
>
> ts = System.currentTimeMillis();
> System.out.println(myset1.myEquals(myset2));
> System.out.println(System.currentTimeMillis() - ts);
> }}
>
> Output result
>
> true2713true589
>
>
> Any ideas? (Related question on SO:
> https://stackoverflow.com/questions/44198103/jdk-java-util-concurrent-
> concurrentskiplistset-equalsobject-o-implementation-e
>
> Thanks & Best Regards
>
> Tenghuan He
>
More information about the core-libs-dev
mailing list