持有一批引用
在编程实践过程中,很多业务场景需要处理一批不确定数量的对象,而又没有必要为每一个对象创建引用(通俗讲,为对象起一个名字),使用对象引用来逐个持有这些对象。很自然地,容器可以解决这一问题。
在逻辑层面,容器在内存中(不是持久化存储)为多项数据提供存储空间。此时,可以创建容器对象,并将这一批对象存储在容器对象中,即使用一个容器对象引用持有一批对象。
对象封装一堆数据,集合存储一堆对象
在java的实现层面,数组和集合类都可称为容器,都可以持有一批引用。
集合扩充了数组
其中,静态数组被java定义为内置数据类型,它当然是持有一组对象的最有效的方式。但数组存在若干不足之处,包括
- 数组一旦声明,长度即固定,不可更改;
- 删除、增加元素的效率低;
- 不能直接获取数组中的已存储的实际元素的数量;
- 数组中数据是有序的、可重复的,不能满足无序的或不可重复的场景;
java集合框架中的多个集合类分别克服了以上缺点,扩充了容器的应用范围,譬如,集合提供了一些数组没有的功能
- 集合容器都可以动态扩容;
- 提供size、contain等方法,可直接获取集合已存储的数量和判断是否存在指定数据;
- 提供了add,addAll等方法,可向指定位置添加元素;
但集合类同样存在不足之处,java的集合类只能存储对象引用,不能存储基本数据类型。而数组可以存储基本数据类型和对象引用。但jdk1.5引入了自动装箱与拆箱机制,用户可以使集合类存储基本数据类型,底层由jvm执行自动装箱操作。
集合内容分类
整个集合框架围绕一组标准接口而设计,可以直接使用这些接口的标准实现,也可以通过这些接口实现自己的集合。集合框架是一个用来代表和操纵集合的统一架构,主要包含如下内容:
-
接口: 代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
-
实现(类): 集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
-
比较器: 提供排序逻辑的实现。包括Comparable和Comparator。
-
工具类: 操作存储在集合中的对象,以实现某种需求。例如:搜索和排序,主要以Collections类和Arrays类的静态方法的方式存在。
三种遍历方式
既然是容器,集合核心功能是存储和遍历。存储主要是集合框架中的接口和类中定义的添加方法,而遍历主要由以下三种。
- 一般for循环方式
这种方式要求集合类中有下标的概念,例如List的子类; - foreach方式
继承了Iterable接口。Iterable接口使所有继承或实现Collection接口的子类可以使用foreach遍历元素。 - 使用迭代器方式
实现Itetator接口,这是迭代器模式 在jdk中具体应用。