ArrayList.asList() 接受一个数组或是用逗号分隔的元素列表,也可以用可变参数,然后将其转为一个List对象。
Collections.addAll()方法接受一个Collection对象,以及一个数组或是一个用逗号分隔的列表,并将元素添加到Collection中。
public class AddingGroups {
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
Integer[] moreInts = {6, 7, 8, 9, 10};
collection.addAll(Arrays.asList(moreInts));
Collections.addAll(collection, 11, 12, 13, 14, 15);
Collections.addAll(collection, moreInts);
for (Integer integer : collection) {
System.out.println(integer);
}
System.out.println("--------------------------------------");
List<Integer> list = Arrays.asList(16, 17, 18, 19, 20);
list.set(1, 99);
for (Integer integer : list) {
System.out.println(integer);
}
}
}
Collection的构造器可以接受另一个Collection,可以使用Arrays.asList()方法作为构造器输入,但是只能接收Collection,所以不太灵活,一般我们可以采用将Arrays.asList()作为参数,然后在调用collection.addAll()方法。
也可以这样:`List<Integer> list = Arrays.asList(1,2,3,4,5);作为输出,但是这样有个问题就是底层是数组,不能调整大小,如果要使用listadd()或者list.delete()方法就会出现异常。
Arrays.asList()方法的限制对它产生的List类型做了理想的假设,但是没有注意到你对它会赋予什么样的类型,这就会引发一些问题:
class Snow{}
class Powder extends Snow{}
class Light extends Powder{}
class Heavy extends Powder{}
class Crusty extends Snow{}
class Slush extends Snow{}
public class AsListInference {
public static void main(String[] args) {
List<Snow> snow1 = Arrays.asList(
new Crusty(), new Slush(), new Powder()
);
//List<Snow> snow2 = Arrays.asList(
// new Light(), new Heavy()
//);
List<Snow> snow3 = new ArrayList<Snow>();
Collections.addAll(snow3, new Light(), new Heavy());
List<Snow> snow4 = Arrays.<Snow>asList(
new Light(), new Heavy()
);
}
}
当视图创建snow2的时候,Arrays.asList()中只有Powder类型,因此它会创建List<Powder>而不是List<Snow>。
创建snow4的时候就解决了创建snow2的问题,在Arrays.asList()中间岔入了一条线索,他会告诉编译器对于Arrays.asList()产生的List类型,这就是显式类型参数说明。
Collections.addAll()工作的很好,因为他从第一个参数中了解到了目标类型是什么。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。