--- jsr166/src/main/java/util/ArrayDeque.java 2015/02/28 20:35:47 1.65 +++ jsr166/src/main/java/util/ArrayDeque.java 2015/09/18 02:06:44 1.69 @@ -247,7 +247,8 @@ public class ArrayDeque extends Abstr } public E pollFirst() { - int h = head; + final Object[] elements = this.elements; + final int h = head; @SuppressWarnings("unchecked") E result = (E) elements[h]; // Element is null if deque empty @@ -259,7 +260,8 @@ public class ArrayDeque extends Abstr } public E pollLast() { - int t = (tail - 1) & (elements.length - 1); + final Object[] elements = this.elements; + final int t = (tail - 1) & (elements.length - 1); @SuppressWarnings("unchecked") E result = (E) elements[t]; if (result != null) { @@ -606,6 +608,20 @@ public class ArrayDeque extends Abstr } lastRet = -1; } + + public void forEachRemaining(Consumer action) { + Objects.requireNonNull(action); + Object[] a = elements; + int m = a.length - 1, f = fence, i = cursor; + cursor = f; + while (i != f) { + @SuppressWarnings("unchecked") E e = (E)a[i]; + i = (i + 1) & m; + if (e == null) + throw new ConcurrentModificationException(); + action.accept(e); + } + } } /** @@ -845,8 +861,21 @@ public class ArrayDeque extends Abstr elements[i] = s.readObject(); } + /** + * Creates a late-binding + * and fail-fast {@link Spliterator} over the elements in this + * deque. + * + *

The {@code Spliterator} reports {@link Spliterator#SIZED}, + * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and + * {@link Spliterator#NONNULL}. Overriding implementations should document + * the reporting of additional characteristic values. + * + * @return a {@code Spliterator} over the elements in this deque + * @since 1.8 + */ public Spliterator spliterator() { - return new DeqSpliterator(this, -1, -1); + return new DeqSpliterator<>(this, -1, -1); } static final class DeqSpliterator implements Spliterator {