< prev index next >
src/java.base/share/classes/java/util/AbstractCollection.java
Print this page
rev 54801 : [mq]: 8223593-Refactor-code-for-reallocating-storage
*** 1,7 ****
/*
! * Copyright (c) 1997, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 1997, 2019, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 23,32 ****
--- 23,34 ----
* questions.
*/
package java.util;
+ import jdk.internal.util.ArraysSupport;
+
/**
* This class provides a skeletal implementation of the {@code Collection}
* interface, to minimize the effort required to implement this interface. <p>
*
* To implement an unmodifiable collection, the programmer needs only to
*** 202,219 ****
// more elements than expected
return it.hasNext() ? finishToArray(r, it) : r;
}
/**
- * The maximum size of array to allocate.
- * Some VMs reserve some header words in an array.
- * Attempts to allocate larger arrays may result in
- * OutOfMemoryError: Requested array size exceeds VM limit
- */
- private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
-
- /**
* Reallocates the array being used within toArray when the iterator
* returned more elements than expected, and finishes filling it from
* the iterator.
*
* @param r the array, replete with previously stored elements
--- 204,213 ----
*** 221,253 ****
* @return array containing the elements in the given array, plus any
* further elements returned by the iterator, trimmed to size
*/
@SuppressWarnings("unchecked")
private static <T> T[] finishToArray(T[] r, Iterator<?> it) {
- int i = r.length;
- while (it.hasNext()) {
int cap = r.length;
if (i == cap) {
! int newCap = cap + (cap >> 1) + 1;
! // overflow-conscious code
! if (newCap - MAX_ARRAY_SIZE > 0)
! newCap = hugeCapacity(cap + 1);
! r = Arrays.copyOf(r, newCap);
}
r[i++] = (T)it.next();
}
// trim if overallocated
! return (i == r.length) ? r : Arrays.copyOf(r, i);
! }
!
! private static int hugeCapacity(int minCapacity) {
! if (minCapacity < 0) // overflow
! throw new OutOfMemoryError
! ("Required array size too large");
! return (minCapacity > MAX_ARRAY_SIZE) ?
! Integer.MAX_VALUE :
! MAX_ARRAY_SIZE;
}
// Modification Operations
/**
--- 215,235 ----
* @return array containing the elements in the given array, plus any
* further elements returned by the iterator, trimmed to size
*/
@SuppressWarnings("unchecked")
private static <T> T[] finishToArray(T[] r, Iterator<?> it) {
int cap = r.length;
+ int i = cap;
+ while (it.hasNext()) {
if (i == cap) {
! cap = ArraysSupport.newCapacity(cap, 1, (cap >> 1) + 1);
! r = Arrays.copyOf(r, cap);
}
r[i++] = (T)it.next();
}
// trim if overallocated
! return (i == cap) ? r : Arrays.copyOf(r, i);
}
// Modification Operations
/**
< prev index next >