--- jsr166/src/main/java/util/PriorityQueue.java 2016/12/02 07:11:36 1.115 +++ jsr166/src/main/java/util/PriorityQueue.java 2018/05/06 16:26:03 1.123 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ package java.util; import java.util.function.Consumer; +import jdk.internal.misc.SharedSecrets; /** * An unbounded priority {@linkplain Queue queue} based on a priority heap. @@ -73,7 +74,7 @@ import java.util.function.Consumer; * ({@code peek}, {@code element}, and {@code size}). * *

This class is a member of the - * + * * Java Collections Framework. * * @since 1.5 @@ -350,8 +351,9 @@ public class PriorityQueue extends Ab private int indexOf(Object o) { if (o != null) { - for (int i = 0; i < size; i++) - if (o.equals(queue[i])) + final Object[] es = queue; + for (int i = 0, n = size; i < n; i++) + if (o.equals(es[i])) return i; } return -1; @@ -379,20 +381,18 @@ public class PriorityQueue extends Ab } /** - * Version of remove using reference equality, not equals. - * Needed by iterator.remove. + * Identity-based version for use in Itr.remove. * * @param o element to be removed from this queue, if present - * @return {@code true} if removed */ - boolean removeEq(Object o) { - for (int i = 0; i < size; i++) { - if (o == queue[i]) { + void removeEq(Object o) { + final Object[] es = queue; + for (int i = 0, n = size; i < n; i++) { + if (o == es[i]) { removeAt(i); - return true; + break; } } - return false; } /** @@ -522,6 +522,8 @@ public class PriorityQueue extends Ab */ private int expectedModCount = modCount; + Itr() {} // prevent access constructor creation + public boolean hasNext() { return cursor < size || (forgetMeNot != null && !forgetMeNot.isEmpty()); @@ -575,8 +577,9 @@ public class PriorityQueue extends Ab */ public void clear() { modCount++; - for (int i = 0; i < size; i++) - queue[i] = null; + final Object[] es = queue; + for (int i = 0, n = size; i < n; i++) + es[i] = null; size = 0; } @@ -631,7 +634,7 @@ public class PriorityQueue extends Ab * promoting x up the tree until it is greater than or equal to * its parent, or is the root. * - * To simplify and speed up coercions and comparisons. the + * To simplify and speed up coercions and comparisons, the * Comparable and Comparator versions are separated into different * methods that are otherwise identical. (Similarly for siftDown.) * @@ -732,12 +735,12 @@ public class PriorityQueue extends Ab @SuppressWarnings("unchecked") private void heapify() { final Object[] es = queue; - final int half = (size >>> 1) - 1; + int i = (size >>> 1) - 1; if (comparator == null) - for (int i = half; i >= 0; i--) + for (; i >= 0; i--) siftDownComparable(i, (E) es[i]); else - for (int i = half; i >= 0; i--) + for (; i >= 0; i--) siftDownUsingComparator(i, (E) es[i]); } @@ -772,8 +775,9 @@ public class PriorityQueue extends Ab s.writeInt(Math.max(2, size + 1)); // Write out all elements in the "proper order". - for (int i = 0; i < size; i++) - s.writeObject(queue[i]); + final Object[] es = queue; + for (int i = 0, n = size; i < n; i++) + s.writeObject(es[i]); } /** @@ -793,11 +797,13 @@ public class PriorityQueue extends Ab // Read in (and discard) array length s.readInt(); + SharedSecrets.getJavaObjectInputStreamAccess().checkArray(s, Object[].class, size); queue = new Object[size]; // Read in all elements. - for (int i = 0; i < size; i++) - queue[i] = s.readObject(); + final Object[] es = queue; + for (int i = 0, n = size; i < n; i++) + es[i] = s.readObject(); // Elements are guaranteed to be in "proper order", but the // spec has never explained what that might be. @@ -891,4 +897,18 @@ public class PriorityQueue extends Ab return Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.NONNULL; } } + + /** + * @throws NullPointerException {@inheritDoc} + */ + @SuppressWarnings("unchecked") + public void forEach(Consumer action) { + Objects.requireNonNull(action); + final int expectedModCount = modCount; + final Object[] es = queue; + for (int i = 0, n = size; i < n; i++) + action.accept((E) es[i]); + if (expectedModCount != modCount) + throw new ConcurrentModificationException(); + } }