容器的基本类型是 List、Set、Queue,这些类型也叫集合类,由于 Java 类库使用 Collection 这个名词只带该类库,所以使用术语 “容器” 来称呼,容器提供了完整的方法来保存对象,Java 容器类都可以自动地调节尺寸。
Collection 是一个独立元素的序列,这些元素都服从一条或多条规则。List 必须按照插入的顺序保存元素,有序可重复,Set 无序不可重复,Queue 按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
Collection 框架图:
这张图可以清晰看出,上面提到的 Set、Queue、List 都继承自 Collection,但是 Map 不在此列,它是一个单独的接口,后面的文章将对它们一一介绍,我们先来看看 Collection。
Collection 是一个接口,它概括了序列的概念,即:一种存放一组对象的方式。现在我们看看 Collection 的基本使用(以 ArrayList 为例):
public class CollectionTest {
public static void main(String[] args) {
//创建 Collection 对象(向上转型)
Collection collection = new ArrayList<>();
for (int i = 0; i < 5; i++) {
//添加元素
collection.add(i);
}
//遍历 collection 并打印
for (Integer i : collection) {
System.out.println(i);
}
}
}
打印结果:
0
1
2
3
4
代码展示了 Collection 对象的创建,任何继承自 Collection 的类的对象都可以通过向上转型创建 Collection 对象,ArrayList 是最基本的序列类型,可参考上图。add() 方法是向 Collection 中添加一个元素, 同时,所有的 Collection 都可以用 foreach 语法进行遍历。
在 java.util 包中的 Arrays 和 Collections 类中包含很多实用的方法,可以在 Collection 中添加一组元素,简单实例如下:
public class CollectionTest {
public static void main(String[] args) {
//创建 Collection 对象(向上转型)
Collection collection = new ArrayList<>(Arrays.asList(1,2,3));
//创建数组
Integer [] ints = {4,5,6};
//Collection 的 addAll 方法,可添加所有 Collection 对象
collection.addAll(Arrays.asList(ints));
//Collections 的 addAll 方法,接受一个 Collection 对象以及一个数组或者列表
Collections.addAll(collection,ints);
Collections.addAll(collection,7,8,9);
//遍历 collection 并打印
for (Integer i : collection) {
System.out.print(i + ",");
}
}
}
打印结果:
1,2,3,4,5,6,4,5,6,7,8,9,
Arrays.asList() 方法可以接受一个数组或者一个用逗号分隔的元素列表(可变参数),并将其转换成一个 List 对象。Collection 的 addAll() 方法只能接受另一个 Collection 对象作为参数,但是 Collections.addAll() 方法接受一个 Collection 对象以及一个数组或者元素列表,并且将元素添加到 Collection 中。因此 Arrays.asList() 和 Collections.addAll() 方法更加灵活,因为它们使用的都是可变参数列表。
注:使用 Arrays.asList() 来创建 List 对象时,因为其底层表示的是数组,因此不能调整尺寸,当试图使用 add() 或者 delete() 方法来对其添加或者删除元素的时候,那么运行时将会报错!
现在我们写一段代码看看各容器的 toString() 方法有什么不同:
/**
* 添加元素
* @param collection
* @return
*/
public static Collection add(Collection collection) {
collection.add(1);
collection.add(3);
collection.add(3);
collection.add(2);
return collection;
}
public static void main(String[] args) {
System.out.print(add(new ArrayList()));
System.out.print(add(new LinkedList()));
System.out.print(add(new HashSet()));
System.out.print(add(new TreeSet()));
System.out.print(add(new LinkedHashSet()));
}
打印如下:
[1, 3, 3, 2][1, 3, 3, 2][1, 2, 3][1, 2, 3][1, 3, 2]
代码中写了一个 add() 方法,传入 Collection 对象,添加几个元素,然后返回该对象。从打印结果可以看出,Collection 打印的内容使用方括号括住,每个元素使用逗号分隔。
ArrayList 和 LinkedList 都是 List 类型,他们都是按照插入的顺序保存元素,元素可重复,但是两者执行某些操作的性能不同,LinkedList 的操作也多于 ArrayList,后面详细介绍。HashSet、TreeSet 和 LinkedHashSet 都是 Set 类型,每个相同的值只保存一次,HashSet 存储方式相当复杂,但是速度最快,如果要保证存储顺序,那么就是用 TreeSet,它按照升序保存对象,而 LinkedHashSet 是按照添加的顺序保存对象。