< 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 >