Arrays.AsList and addAll

3
有人能解释一下什么是差异吗?
private List<Coin> mycCoins = new ArrayList<>();

public Purse(Coin...coins) {
    myCoins = Arrays.asList(coins);
    myCoins.addAll(Arrays.asList(coins));
}

在这些myCoins之间做什么?

为什么我不能这样做?

mycCoins.addAll(coins);

实际上,了解我是否以这种方式编写将非常有趣。

for (Coin coin : coins) {
        mycCoins.add(coin);

这种方法与我上面提到的方法有何不同?

请帮助我,并向我解释一下。

3个回答

2
Arrays.asList(coins)会给你一个全新的列表,但它不是通常意义上的ArrayList。它是一种具有固定大小数组的特殊类型列表,这意味着您无法在其中添加或删除元素。它被限制在原始大小的coins上,尽管您可以修改其中的值。 addAll(something)将硬币添加到您已经拥有的任何类型的List中。您可以在已创建的ArrayList上调用它,元素数量实际上会增加。
传递给addAll的内容不能是数组,而必须是某种类型的Collection,因为addAll是这样定义的。在大多数情况下,最简单的方法是将其传递给从Array.asList获得的不可调整大小的列表之一,例如:
myList.addAll(Arrays.asList(coins));

0

因为addAll的定义如下:

addAll(Collection<? extends E> c)

它只能接受集合作为参数。coins不是一个集合。

当你执行:

for(Coin coin : coins)
   myCoins.add(coin)

这是可以的,因为您正在将一个Coin引用添加到一个List<Coin>中。


你还应该提到,它会抛出一个 UnsupportedOperationException 异常,因为 OP 使用了 Arrays#asList 并试图向其添加元素。 - Jacob G.
@JacobG。我猜你可以使用arrayList.addAll(new ArrayList(asList(...))),对吗? - Yassin Hajaj
@JacobG. 这个问题有点脱离上下文,但我感觉这是一个打字错误,应该是 mycCoins.addAll(myCoins); 而不是 myCoins.addAll(Arrays.asList(coins)); 假设 OP 的确是这个意思,那么就不应该出现上述异常。 - Ousmane D.
是的,我刚注意到了。我不知道为什么 OP 把这两个 “List” 命名得如此相似,哈哈。 - Jacob G.
1
@YassinHajaj 这样做 arrayList.addAll(new ArrayList(asList(...))) 是多余的,可以直接使用 arrayList.addAll(asList(...)) - Ousmane D.

0
myCoins = Arrays.asList(coins); // OK
Arrays.asList(E) 返回 List,你将其分配给 ArrayList。
myCoins.addAll(Arrays.asList(coins)); // OK
Collection 方法 addAll 的第一个参数需要传入 Collection。Arrays.asList 返回一个集合。
从 javadocs 中可以看到 Collection -> addAll(Collection c)。
myCoins.addAll(coins); // NOT OK
在你的代码中,coins 是可变参数。编译器将可变参数视为数组。"addAll" 不接受 [] 作为参数。
for (Coin coin : coins) { myCoins.add(coin); // OK
由于你正在遍历 coins 数组并添加每个对象,因此这是正确的做法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接