//这种是无参的,返回的数组长度=iterator的个数,因此可以处理并发情况publicObject[]toArray(){// Estimate size of array; be prepared to see more or fewer elementsObject[] r =newObject[size()];//构建新数组,这个size()只是暂时的量,因为可能在遍历过程中元素个数增加或减少Iterator<E> it =iterator();for(int i =0; i < r.length; i++){if(! it.hasNext())// fewer elements than expected ,这种情况表明在遍历的过程中元素减少了,就使用copyof构建一个长度为i的数组returnArrays.copyOf(r, i);
r[i]= it.next();}return it.hasNext()?finishToArray(r, it): r;//如果超出预定长度之后迭代器中还有元素,此时进入finishToArray方法进行处理}privatestatic<T>T[]finishToArray(T[] r,Iterator<?> it){int i = r.length;while(it.hasNext()){int cap = r.length;if(i == cap){//如果当前容量=数组的最大值,就要给数组进行扩容,第一次传入的时候就已经容量相等了,肯定是要扩容的,就像c中的listsize和length一样int newCap = cap +(cap >>1)+1;// cap>>1,右移移位相当于/2.左移一位相当于*2,这个是动态数组的默认扩容方式,扩容50%// overflow-conscious codeif(newCap -MAX_ARRAY_SIZE>0)
newCap =hugeCapacity(cap +1);//处理超出int范围之后的值
r =Arrays.copyOf(r, newCap);}
r[i++]=(T)it.next();}// trim if overallocatedreturn(i == r.length)? r :Arrays.copyOf(r, i);//将新数组的多余空间裁剪掉,保证长度是和原集合中元素的个数是相等的}//这个值是比int的最大值小8,因为不同jvm会留一部分空间作为关键字privatestaticfinalintMAX_ARRAY_SIZE=Integer.MAX_VALUE-8;privatestaticinthugeCapacity(int minCapacity){if(minCapacity <0)// overflow ,<0表明已经溢出,新容量是否超出了int的范围,因为一旦超出int范围之后,由于补码的缘故,会将最高位挤出去,就会变为负值,thrownewOutOfMemoryError("Required array size too large");return(minCapacity >MAX_ARRAY_SIZE)?Integer.MAX_VALUE:MAX_ARRAY_SIZE;}//如果传入的数组a的长度大于集合中的元素个数,就将所有元素存入数组中,空余的置null,否则就会返回一个类型相同的,且长度=集合长度的数组。public<T>T[]toArray(T[] a){// Estimate size of array; be prepared to see more or fewer elementsint size =size();T[] r = a.length >= size ? a :(T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);Iterator<E> it =iterator();for(int i =0; i < r.length; i++){if(! it.hasNext()){// fewer elements than expectedif(a == r){
r[i]=null;// null-terminate}elseif(a.length < i){returnArrays.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 expectedreturn it.hasNext()?finishToArray(r, it): r;}