RFR [8011215] optimization of CopyOnWriteArrayList.addIfAbsent()

Ivan Gerasimov ivan.gerasimov at oracle.com
Tue Apr 2 18:53:09 UTC 2013


Hello everybody!

Please review my proposal for the CopyOnWriteArrayList.addIfAbsent() method optimization.

http://washi.ru.oracle.com/~igerasim/webrevs/8011215/webrev/index.html

Here is the original function body:
------------------------------------------------
     Object[] elements = getArray();
     int len = elements.length;
     Object[] newElements = new Object[len + 1]; <-- allocate new array in advance
     for (int i = 0; i < len; ++i) {
         if (eq(e, elements[i]))                 <-- check whether e is null on every iteration
             return false; // exit, throwing away copy
         else
             newElements[i] = elements[i];       <-- copy elements one by one
     }
     newElements[len] = e;
     setArray(newElements);
------------------------------------------------
The proposed change is to reuse CopyOnWriteArrayList.indexOf() function to check if e is already in the array.
If the check passed, new array is allocated withArrays.copyOf(). It uses native System.arraycopy(), which is probably faster than copying elements in the loop.

Sincerely yours,
Ivan




More information about the core-libs-dev mailing list