Collections.copy(dest, src)的作用是将src的内容复制到dest中。
但是下面的代码会报错:
public class CollectionsTest {
public static void main(String[] args) {
List src = new ArrayList();
src.add(234);
src.add("asdf");
List dest = new ArrayList();
Collections.copy(dest, src);
System.out.println(dest);
}
}
报Source does not fit in dest的错误。
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
int srcSize = src.size();
if (srcSize > dest.size())
throw new IndexOutOfBoundsException("Source does not fit in dest");
if (srcSize < COPY_THRESHOLD ||
(src instanceof RandomAccess && dest instanceof RandomAccess)) {
for (int i=0; i<srcSize; i++)
dest.set(i, src.get(i));
} else {
ListIterator<? super T> di=dest.listIterator();
ListIterator<? extends T> si=src.listIterator();
for (int i=0; i<srcSize; i++) {
di.next();
di.set(si.next());
}
}
}
看上图copy方法的源码可以发现,报错的原因是srcSize > dest.size()。也就dest长度小于sec的长度。但是改为List dest = new ArrayList(10);也报错。
这是因为size的长度与定义的ArrayList的元素个数有关。
new ArrayList(10);里面的10是指ArrayList底层的数组长度为10,而不是size为10。
可以用下面的方法解决此问题。
public class CollectionsTest {
public static void main(String[] args) {
List src = new ArrayList();
src.add(234);
src.add("asdf");
// List dest = new ArrayList(10);
List dest = Arrays.asList(new Object[src.size()]);
Collections.copy(dest, src);
System.out.println(dest);
}
}