Java 为什么Collections.copy操作对列表的大小而不是列表的容量起作用?

Java 为什么Collections.copy操作对列表的大小而不是列表的容量起作用?,java,collections,Java,Collections,下面是我尝试过的代码: //Initialized the first list with initial capacity 2 List<String> list1=new ArrayList<String>(2); list1.add("banana"); list1.add("apple"); //Initialized the second list with initial capacity 4 List<String> list2=new Arr

下面是我尝试过的代码:

//Initialized the first list with initial capacity 2
List<String> list1=new ArrayList<String>(2);
list1.add("banana");
list1.add("apple");

//Initialized the second list with initial capacity 4
List<String> list2=new ArrayList<String>(4);

//Performing copying
Collections.copy(list2, list1);
//用初始容量2初始化了第一个列表
列表列表1=新的ArrayList(2);
清单1.添加(“香蕉”);
列表1.添加(“苹果”);
//用初始容量4初始化第二个列表
列表列表2=新的ArrayList(4);
//执行复制
收藏。复制(列表2,列表1);
但复制操作因IndexOutOfBoundsOperation而失败。
原因:-源不适合目标

问题:为什么复制操作会影响大小,即中的元素数 名单?为什么它不按容量运行

根据报告:

复制 将所有元素从一个列表复制到另一个列表中。操作完成后,目标列表中每个复制元素的索引将与其在源列表中的索引相同。目标列表必须至少与源列表一样长。如果更长,则目标列表中的其余元素不受影响。 此方法以线性时间运行

投掷 IndexOutOfBoundsException-如果目标列表太小,无法包含整个源列表。 UnsupportedOperationException-如果目标列表的列表迭代器不支持set操作

好吧。。。这只是人们想要的行为。如果要将一个列表中的所有元素添加到另一个列表中,可以
list\addAll

public static <T> void copy(List<? super T> dest, List<? extends T> src)
Collections.copy
无法使用
add
增加
l2
的大小,因为
数组。asList
返回固定大小的
列表
,不支持
add
。因此,
l2
的大小必须足够大,以适合
l1
的所有元素


因此,从实施情况看,,你会看到,
Collections.copy
使用
set
而不是
add

我的问题是为什么会这样?@AmitBhati它有助于实现另一个列表,该列表具有相同顺序的相同元素,但是你应该用相同数量的元素填充另一个列表,即在我的例子中,我必须在列表2中输入两个随机值,以获得列表1的副本。@AmitBhati-Q:为什么自行车有两个轮子。A:因为如果它没有两个轮子,它会是一辆独轮车,或者三轮车,或者。。。波戈棍子。为了回答您的问题,它是这样设计的,因为它旨在满足特定的需求。如果它是为了满足不同的需求,那么它的设计就会有所不同。@Stephen well说,明白了。容量只对
ArrayList
s有意义。
Collections::copy
方法需要处理所有类型的集合。因此,根据集合的类型使用稍微不同的语义将非常令人困惑。
List<String> l1 = Arrays.asList("a","b","c");
List<String> l2 = Arrays.asList("1","2");
Collections.copy(l1,l2);