sp; Iterator<E> it = iterator(); for (int i = 0; i < r.length; i++) { //集合元素大小小于数组的长度 if (! it.hasNext()) { // fewer elements than expected if (a == r) {//如果数组是参数中的数组,则将剩余部分的值都设置为null r[i] = null; // null-terminate } else if (a.length < i) {//如果传入的数组长度小于集合长度,则通过Arrays.copyOf将之前数组中的元素复制到新数组中 return Arrays.copyOf(r, i); } else {//如果传入数组的长度比集合大,则将多的元素设置为空 System.arraycopy(r, 0, a, 0, i); if (a.length > i) { a[i] = null; } } return a; } r[i] = (T)it.next(); } // more elements than expected //集合元素大小大于数组的长度 return it.hasNext() ? finishToArray(r, it) : r; } private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; /** * 功能:数组扩容 * (1)当数组索引指向最后一个元素+1时,对数组进行扩容:即创建一个更长的数组,然后将原数组的内容复制到新数组中 * (2)扩容大小:cap + cap/2 +1 * (3)扩容前需要先判断是否数组长度是否溢出 * 注意:这里的迭代器是从上层的方法(toArray)传过来的,并且这个迭代器已执行了一部分,而不是从头开始迭代的 */ 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"); &nb |