--- jsr166/src/main/java/util/ArrayDeque.java 2017/05/31 19:01:08 1.129 +++ jsr166/src/main/java/util/ArrayDeque.java 2018/11/11 17:37:30 1.137 @@ -8,7 +8,7 @@ package java.util; import java.io.Serializable; import java.util.function.Consumer; import java.util.function.Predicate; -import java.util.function.UnaryOperator; +// OPENJDK import jdk.internal.access.SharedSecrets; /** * Resizable-array implementation of the {@link Deque} interface. Array @@ -50,7 +50,7 @@ import java.util.function.UnaryOperator; * Iterator} interfaces. * *

This class is a member of the - * + * * Java Collections Framework. * * @author Josh Bloch and Doug Lea @@ -180,7 +180,7 @@ public class ArrayDeque extends Abstr * sufficient to hold 16 elements. */ public ArrayDeque() { - elements = new Object[16]; + elements = new Object[16 + 1]; } /** @@ -208,11 +208,11 @@ public class ArrayDeque extends Abstr */ public ArrayDeque(Collection c) { this(c.size()); - addAll(c); + copyElements(c); } /** - * Increments i, mod modulus. + * Circularly increments i, mod modulus. * Precondition and postcondition: 0 <= i < modulus. */ static final int inc(int i, int modulus) { @@ -221,7 +221,7 @@ public class ArrayDeque extends Abstr } /** - * Decrements i, mod modulus. + * Circularly decrements i, mod modulus. * Precondition and postcondition: 0 <= i < modulus. */ static final int dec(int i, int modulus) { @@ -234,7 +234,7 @@ public class ArrayDeque extends Abstr * Precondition: 0 <= i < modulus, 0 <= distance <= modulus. * @return index 0 <= i < modulus */ - static final int add(int i, int distance, int modulus) { + static final int inc(int i, int distance, int modulus) { if ((i += distance) - modulus >= 0) i -= modulus; return i; } @@ -244,7 +244,7 @@ public class ArrayDeque extends Abstr * Index i must be logically ahead of index j. * Precondition: 0 <= i < modulus, 0 <= j < modulus. * @return the "circular distance" from j to i; corner case i == j - * is diambiguated to "empty", returning 0. + * is disambiguated to "empty", returning 0. */ static final int sub(int i, int j, int modulus) { if ((i -= j) < 0) i += modulus; @@ -324,11 +324,15 @@ public class ArrayDeque extends Abstr final int s, needed; if ((needed = (s = size()) + c.size() + 1 - elements.length) > 0) grow(needed); - c.forEach(this::addLast); + copyElements(c); // checkInvariants(); return size() > s; } + private void copyElements(Collection c) { + c.forEach(this::addLast); + } + /** * Inserts the specified element at the front of this deque. * @@ -840,7 +844,7 @@ public class ArrayDeque extends Abstr final int i, n; return ((n = sub(getFence(), i = cursor, es.length) >> 1) <= 0) ? null - : new DeqSpliterator(i, cursor = add(i, n, es.length)); + : new DeqSpliterator(i, cursor = inc(i, n, es.length)); } public void forEachRemaining(Consumer action) { @@ -912,7 +916,7 @@ public class ArrayDeque extends Abstr * @param operator the operator to apply to each element * @since TBD */ - /* public */ void replaceAll(UnaryOperator operator) { + /* public */ void replaceAll(java.util.function.UnaryOperator operator) { Objects.requireNonNull(operator); final Object[] es = elements; for (int i = head, end = tail, to = (i <= end) ? end : es.length; @@ -1235,6 +1239,7 @@ public class ArrayDeque extends Abstr // Read in size and allocate array int size = s.readInt(); + jsr166.Platform.checkArray(s, Object[].class, size + 1); elements = new Object[size + 1]; this.tail = size;