程序 = 数据结构 + 算法
- 数据结构储存在什么地方?
- 复杂的数据结构怎么存储?
java.util 库提供了一套相当完整的集合类(collection classes)来解决这个问题,其中基本的类型有 List 、 Set 、 Queue 和 Map。
这些类型也被称作容器类(container classes),但我将使用Java类库使用的术语。集合提供了完善的方法来保存对象,可以使用这些工具来解决大量的问题。
泛型
类型安全的集合
Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常.
泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
参数化类型:
- 把类型当作是参数一样传递
<数据类型>
只能是引用类型
相关术语:
ArrayList<E>
中的E称为类型参数变量ArrayList<Integer>
中的Integer称为实际类型参数- 整个称为
ArrayList<E>
泛型类型 - 整个
ArrayList<Integer>
称为参数化的类型ParameterizedType
例如:ArrayList<Object> apple = new ArrayList<>();
使用泛型,从 apple 中获取元素不需要强制类型转换。
因为 apple 知道它持有什么类型,因此当调用 get() 时,它会替你执行转型。
因此,使用泛型,你不仅知道编译器将检查放入集合的对象类型,而且在使用集合中的对象时也可以获得更清晰的语法。
Java集合类库采用“持有对象”(holding objects)的思想,并将其分为两个不同的概念,表示为类库的基本接口:
- 集合(Collection) :一个独立元素的序列,这些元素都服从一条或多条规则。Map必须以插入的顺序保存元素, Set 不能包含重复元素, Queue 按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
- 映射(Map) : 一组成对的“键值对”对象,允许使用键来查找值。 ArrayList 使用数字来查找对象,因此在某种意义上讲,它是将数字和对象关联在一起。 map 允许我们使用一个对象来查找另一个对象,它也被称作关联数组(associative array),因为它将对象和其它对象关联在一起;或者称作字典(dictionary),因为可以使用一个键对象来查找值对象,就像在字典中使用单词查找定义一样。 Map 是强大的编程工具。
Collection
- List
- Set
- Queue
Map
- HashMap
- TreeMap
- LinkedHashMap
- WaekHashMap
- IdentityHashMap
- HashTabke
下面是译者绘制的 Java 集合框架简图:
- 黄色为接口
- 绿色为抽象类
- 蓝色为具体类
- 虚线箭头表示实现关系
- 实线箭头表示继承关系
集合与迭代器
for-in和迭代器