集合解决的问题
在编程过程中我们通常需要集中存储多个数据,数组看起来像是一个不错的解决方案,但是在创建数组的前提是我们已经明确知道要保存数据的数量。一旦数组创建,数组长度是不能变的,如果我们需要保存一个动态增长的数据(在编译时不确定数据量),java集合就给出了很好的解决方案。集合框架提供了保存动态增长数据的能力,提供了丰富的数据结构,定义了统一的数据操作规范。
集合种类
常用的集合大致分成两类
- Collection 用来存放一组独立的元素,通常这些元素都服从某种规则
- List 必须保证元素的特定顺序
- Set 必须保证元素的唯一性,即不包含重复元素
- Queue 必须保证元素先进先出的顺序,即队列
- Map 用来存放一组“键值对”对象
集合接口的层次关系
集合中常用接口和实现类的层次关系如下图:
Iterable 接口
Iterable,迭代器接口,是Collection的父接口,实现这个Iterable接口的对象允许使用foreach进行遍历,也就是说所有实现了Collection接口的集合都可以通过foreach循环进行遍历。Iterable接口里有一个方法:
Iterator<T> iterator();
通过该方法可以获取一个代表泛型对象的迭代器,可用于对集合的遍历。
Collection 接口
Collection接口提供一系列操作数据的基本方法
主要的操作就是 add remove 和 contains ,这个有点像是一个背包,既不强调顺序也不强调不重复。
List 接口
相对于Collection接口 List接口新增了下面这些方法:
List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引。基于这些特性,List的迭代器也更高级了些,ListIterator支持向前和向后双向的迭代。
Set 接口
Set继承自Collection接口,不能包含有重复元素(这是整个Set类层次的共有属性)。
Set判断两个对象相同不是使用”==“运算符,而是根据equals方法。也就是说,我们在加入一个新元素的时候,如果这个新元素对象和Set中已有对象进行注意equals比较都返回false,则Set就会接受这个新元素对象,否则拒绝。
Queue 接口
Queue用于模拟”队列”这种数据结构(先进先出 FIFO)。队列的头部保存着队列中存放时间最长的元素,队列的尾部保存着队列中存放时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素,队列不允许随机访问队列中的元素。
Map
Map用于保存具有”映射关系”的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value。key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较结果总是返回false。关于Map,我们要从代码复用的角度去理解,java是先实现了Map,然后通过包装了一个所有value都为null的Map就实现了Set集合,Map的这些实现类和子接口中key集的存储形式和Set集合完全相同(即key不能重复),Map的这些实现类和子接口中value集的存储形式和List非常类似(即value可以重复、根据索引来查找)