为什么Collections.copy操作适用于列表大小而不是列表容量?

时间:2016-12-22 11:18:00

标签: 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 ArrayList<String>(4);

//Performing copying
Collections.copy(list2, list1);

但是使用IndexOutOfBoundsOperation复制操作失败 原因: - 源不适合dest。

  

质疑为什么复制操作正在处理大小,即没有元素   一个列表?为什么它不对容量进行操作?

2 个答案:

答案 0 :(得分:4)

根据documentation

复制

  

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

引发

  

IndexOutOfBoundsException - 如果目标列表太小而无法包含整个源列表。   UnsupportedOperationException - 如果目标列表的list-iterator不支持set操作。

那么......它只是想要的行为。如果您想将一个列表的所有元素添加到另一个列表,可以List#addAll

答案 1 :(得分:0)

public static <T> void copy(List<? super T> dest, List<? extends T> src)

此方法适用于任何两个List实现。

如果您使用以下内容运行该怎么办?

List<String> l1 = Arrays.asList("a","b","c");
List<String> l2 = Arrays.asList("1","2");
Collections.copy(l1,l2);

Collections.copy无法使用add来增加l2的尺寸,因为Arrays.asList会返回固定尺寸List并且不会add t支持l2。因此,l1的大小必须足够大,以适合Collections.copy的所有元素。

因此,查看实施情况,您会发现set使用add而不是export class UserComponent implements OnInit { score : number; constructor(private route: ActivatedRoute, private userService: UserService) {} ngOnInit() { this.sub = this.route.params.subscribe(params => { this.userId = params['id']; this.userService.getUser(this.charId) .subscribe( (user: User) => { this.user = user this.user.score = calcScore(this.user.height, this.user.weight) }); }); } }