1 |
|
/* |
2 |
< |
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. |
2 |
> |
* Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. |
3 |
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 |
|
* |
5 |
|
* This code is free software; you can redistribute it and/or modify it |
26 |
|
package java.util; |
27 |
|
|
28 |
|
import java.util.function.Consumer; |
29 |
+ |
import jdk.internal.misc.SharedSecrets; |
30 |
|
|
31 |
|
/** |
32 |
|
* An unbounded priority {@linkplain Queue queue} based on a priority heap. |
351 |
|
|
352 |
|
private int indexOf(Object o) { |
353 |
|
if (o != null) { |
354 |
< |
for (int i = 0; i < size; i++) |
355 |
< |
if (o.equals(queue[i])) |
354 |
> |
final Object[] es = queue; |
355 |
> |
for (int i = 0, n = size; i < n; i++) |
356 |
> |
if (o.equals(es[i])) |
357 |
|
return i; |
358 |
|
} |
359 |
|
return -1; |
381 |
|
} |
382 |
|
|
383 |
|
/** |
384 |
< |
* Version of remove using reference equality, not equals. |
383 |
< |
* Needed by iterator.remove. |
384 |
> |
* Identity-based version for use in Itr.remove. |
385 |
|
* |
386 |
|
* @param o element to be removed from this queue, if present |
386 |
– |
* @return {@code true} if removed |
387 |
|
*/ |
388 |
< |
boolean removeEq(Object o) { |
389 |
< |
for (int i = 0; i < size; i++) { |
390 |
< |
if (o == queue[i]) { |
388 |
> |
void removeEq(Object o) { |
389 |
> |
final Object[] es = queue; |
390 |
> |
for (int i = 0, n = size; i < n; i++) { |
391 |
> |
if (o == es[i]) { |
392 |
|
removeAt(i); |
393 |
< |
return true; |
393 |
> |
break; |
394 |
|
} |
395 |
|
} |
395 |
– |
return false; |
396 |
|
} |
397 |
|
|
398 |
|
/** |
577 |
|
*/ |
578 |
|
public void clear() { |
579 |
|
modCount++; |
580 |
< |
for (int i = 0; i < size; i++) |
581 |
< |
queue[i] = null; |
580 |
> |
final Object[] es = queue; |
581 |
> |
for (int i = 0, n = size; i < n; i++) |
582 |
> |
es[i] = null; |
583 |
|
size = 0; |
584 |
|
} |
585 |
|
|
775 |
|
s.writeInt(Math.max(2, size + 1)); |
776 |
|
|
777 |
|
// Write out all elements in the "proper order". |
778 |
< |
for (int i = 0; i < size; i++) |
779 |
< |
s.writeObject(queue[i]); |
778 |
> |
final Object[] es = queue; |
779 |
> |
for (int i = 0, n = size; i < n; i++) |
780 |
> |
s.writeObject(es[i]); |
781 |
|
} |
782 |
|
|
783 |
|
/** |
797 |
|
// Read in (and discard) array length |
798 |
|
s.readInt(); |
799 |
|
|
800 |
+ |
SharedSecrets.getJavaObjectInputStreamAccess().checkArray(s, Object[].class, size); |
801 |
|
queue = new Object[size]; |
802 |
|
|
803 |
|
// Read in all elements. |
804 |
< |
for (int i = 0; i < size; i++) |
805 |
< |
queue[i] = s.readObject(); |
804 |
> |
final Object[] es = queue; |
805 |
> |
for (int i = 0, n = size; i < n; i++) |
806 |
> |
es[i] = s.readObject(); |
807 |
|
|
808 |
|
// Elements are guaranteed to be in "proper order", but the |
809 |
|
// spec has never explained what that might be. |
897 |
|
return Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.NONNULL; |
898 |
|
} |
899 |
|
} |
900 |
+ |
|
901 |
+ |
/** |
902 |
+ |
* @throws NullPointerException {@inheritDoc} |
903 |
+ |
*/ |
904 |
+ |
@SuppressWarnings("unchecked") |
905 |
+ |
public void forEach(Consumer<? super E> action) { |
906 |
+ |
Objects.requireNonNull(action); |
907 |
+ |
final int expectedModCount = modCount; |
908 |
+ |
final Object[] es = queue; |
909 |
+ |
for (int i = 0, n = size; i < n; i++) |
910 |
+ |
action.accept((E) es[i]); |
911 |
+ |
if (expectedModCount != modCount) |
912 |
+ |
throw new ConcurrentModificationException(); |
913 |
+ |
} |
914 |
|
} |