1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
   |  public E remove(int index) {     final ReentrantLock lock = this.lock;     lock.lock();     try {         Object[] elements = getArray();         int len = elements.length;                  E oldValue = get(elements, index);         int numMoved = len - index - 1;         if (numMoved == 0)             setArray(Arrays.copyOf(elements, len - 1));         else {             Object[] newElements = new Object[len - 1];             System.arraycopy(elements, 0, newElements, 0, index);             System.arraycopy(elements, index + 1, newElements, index, numMoved);             setArray(newElements);         }         return oldValue;     } finally {         lock.unlock();     } }
 
  public boolean remove(Object o) {     Object[] snapshot = getArray();          int index = indexOf(o, snapshot, 0, snapshot.length);     return (index < 0) ? false : remove(o, snapshot, index); }
  private static int indexOf(Object o, Object[] elements, int index, int fence) {     if (o == null) {         for (int i = index; i < fence; i++)             if (elements[i] == null)                 return i;     } else {         for (int i = index; i < fence; i++)             if (o.equals(elements[i]))                 return i;     }     return -1; }
  private boolean remove(Object o, Object[] snapshot, int index) {     final ReentrantLock lock = this.lock;     lock.lock();     try {         Object[] current = getArray();         int len = current.length;                  if (snapshot != current) findIndex: {             int prefix = Math.min(index, len);             for (int i = 0; i < prefix; i++) {                 if (current[i] != snapshot[i] && eq(o, current[i])) {                     index = i;                     break findIndex;                 }             }             if (index >= len)                 return false;             if (current[index] == o)                 break findIndex;             index = indexOf(o, current, index, len);             if (index < 0)                 return false;         }         Object[] newElements = new Object[len - 1];         System.arraycopy(current, 0, newElements, 0, index);         System.arraycopy(current, index + 1, newElements, index, len - index - 1);         setArray(newElements);         return true;     } finally {         lock.unlock();     } }
 
  void removeRange(int fromIndex, int toIndex) {     final ReentrantLock lock = this.lock;     lock.lock();     try {         Object[] elements = getArray();         int len = elements.length;
          if (fromIndex < 0 || toIndex > len || toIndex < fromIndex)             throw new IndexOutOfBoundsException();         int newlen = len - (toIndex - fromIndex);         int numMoved = len - toIndex;         if (numMoved == 0)             setArray(Arrays.copyOf(elements, newlen));         else {             Object[] newElements = new Object[newlen];             System.arraycopy(elements, 0, newElements, 0, fromIndex);             System.arraycopy(elements, toIndex, newElements, fromIndex, numMoved);             setArray(newElements);         }     } finally {         lock.unlock();     } }
 
  |