一、接口和实现分离

Java中的集合类库将 接口和实现分离。分离的好处是 可以使用  接口类型的引用 指向实际类型的 对象。这样 当发现具体的实现类型无法满足需要时,只需要更换具体的实现类型就可以了,兼容性很好。

二、集合接口和迭代器接口

Java中 集合(list set queue)的基本接口是 Collection接口,此接口包含 add方法和iterator方法。iterator方法返回一个实现了 Iterator接口的对象,可以通过这个对象来迭代集合中的所有元素。

从Java5开始,可以使用for each循环的方式来迭代一个集合中的所有元素。for each循环要求 迭代的对象 实现了 Iteable接口,即可以通过iterator方法 获取到 实现了 Iterator接口的对象。

Collection接口实现了 Iteable接口,因此标准库中的集合都可以 应用 for each迭代。

元素的访问顺序取决于具体的 集合类型,ArrayList的迭代将从 0开始顺序迭代,而 HashSet中的每个元素会以随机的顺序出现,无法预知元素的迭代顺序。

Java中的迭代器 在两个元素之间,调用next方法时,迭代器会越过下个元素,并返回刚刚越过的那个元素的引用。

Collection接口声明了很多的方法,如果我们定义自己的实现类时实现Collection接口,则需要实现全部的方法,通常 这样没有必要。AbstractCollection方法实现了给出了Collection接口中的一些通用的实现,具体的集合类可以扩展子 AbstractCollection方法。

三、具体的集合

以Map结尾的类实现了Map接口,其他的集合类实现了Collection接口。

1、List

ArrayList内部是数组的实现,随机读取的能力很好,但是在中间插入和删除元素时,因为需要将剩余的元素全部向前或者向后移动,会有很大的开销。

LinkedList是基于链表的实现,在中间插入和删除元素时很轻松,但是 随机读取中间某个位置的元素时,开销很大,需要从第一个节点开始迭代 一直到对应的节点

2、散列集

散列表可以快速的查找所需要的对象,它会为每个对象计算一个整数,即 散列码,散列码是 由对象的实例域产生的一个整数。

装填因子决定何时对散列表进行再散列,装填因子的默认值为 0.75,即当 75%的位置已经填入元素时,这个表会以 双倍的桶数进行再散列。

散列表 可以用于实现重要的数据结构,最简单的set类型。set是没有重复的元素集合,它的add方法会首先查找要添加的对象,如果不存在则 添加进去。

HashSet类实现了基于散列表的集,元素不能重复,add方法添加元素,contains方法 重新定义用于查看某个元素是否已经出现在集合中。

TreeSet是一个有序集合,每次将一个元素添加到集合中时,元素都会被放到正确的排序位置上。既然涉及到排序,则 要么存储的类型 实现了 Comparable接口,要么 创建 TreeSet时传入一个实现了 Comparator接口的对象,一般传入匿名对象即可。

3、映射表

HashMap和 TreeMap。同样 HashMap对 key进行散列,而 TreeMap对key进行排序。通常不需要排序的 HashMap的速度会快一些。

可以 使用 keySet()、values()、entrySet()获得映射表的视图,返回的值 是 实现了set接口的对象,可以使用 视图迭代和修改对应的值

4、集合框架

数组转换为 list 使用 Arrays.asList()方法 将数组转换为List,传递给要求List的入口处

不可修改的视图  Collections.unmodifiable... 方法可以生成不佳而修改的视图,其实就是 将修改视图的方法 改为 抛出一个异常。

同步视图  Collections.synchronized...方法 可以将普通的 集合变成 方法都是同步的集合