企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## [添加元素组](https://lingcoder.gitee.io/onjava8/#/book/12-Collections?id=%e6%b7%bb%e5%8a%a0%e5%85%83%e7%b4%a0%e7%bb%84) 在**java.util**包中的**Arrays**和**Collections**类中都有很多实用的方法,可以在一个**Collection**中添加一组元素。 `Arrays.asList()`方法接受一个数组或是逗号分隔的元素列表(使用可变参数),并将其转换为**List**对象。`Collections.addAll()`方法接受一个**Collection**对象,以及一个数组或是一个逗号分隔的列表,将其中元素添加到**Collection**中。下边的示例展示了这两个方法,以及更通用的 、所有**Collection**类型都包含的`addAll()`方法: ~~~ // collections/AddingGroups.java // Adding groups of elements to Collection objects import java.util.*; public class AddingGroups { public static void main(String[] args) { Collection<Integer> collection = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); Integer[] moreInts = { 6, 7, 8, 9, 10 }; collection.addAll(Arrays.asList(moreInts)); // Runs significantly faster, but you can't // construct a Collection this way: Collections.addAll(collection, 11, 12, 13, 14, 15); Collections.addAll(collection, moreInts); // Produces a list "backed by" an array: List<Integer> list = Arrays.asList(16,17,18,19,20); list.set(1, 99); // OK -- modify an element // list.add(21); // Runtime error; the underlying // array cannot be resized. } } ~~~ **Collection**的构造器可以接受另一个**Collection**,用它来将自身初始化。因此,可以使用`Arrays.asList()`来为这个构造器产生输入。但是,`Collections.addAll()`运行得更快,而且很容易构建一个不包含元素的**Collection**,然后调用`Collections.addAll()`,因此这是首选方式。 `Collection.addAll()`方法只能接受另一个**Collection**作为参数,因此它没有`Arrays.asList()`或`Collections.addAll()`灵活。这两个方法都使用可变参数列表。 也可以直接使用`Arrays.asList()`的输出作为一个**List**,但是这里的底层实现是数组,没法调整大小。如果尝试在这个**List**上调用`add()`或`remove()`,由于这两个方法会尝试修改数组大小,所以会在运行时得到“Unsupported Operation(不支持的操作)”错误: ~~~ // collections/AsListInference.java import java.util.*; 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()); //- snow1.add(new Heavy()); // Exception List<Snow> snow2 = Arrays.asList( new Light(), new Heavy()); //- snow2.add(new Slush()); // Exception List<Snow> snow3 = new ArrayList<>(); Collections.addAll(snow3, new Light(), new Heavy(), new Powder()); snow3.add(new Crusty()); // Hint with explicit type argument specification: List<Snow> snow4 = Arrays.<Snow>asList( new Light(), new Heavy(), new Slush()); //- snow4.add(new Powder()); // Exception } } ~~~ 在**snow4**中,注意`Arrays.asList()`中间的“暗示”(即`<Snow>`),告诉编译器`Arrays.asList()`生成的结果**List**类型的实际目标类型是什么。这称为*显式类型参数说明*(explicit type argument specification)。