Java集合框架被设计成要满足以下几个目标。
- 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
- 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
- 对一个集合的扩展和适应必须是简单的。
为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: linkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。
1.Java集合框架从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、linkedList、HashSet、linkedHashSet、HashMap、linkedHashMap 等等。
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
- 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
- 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、linkedList、HashSet、HashMap。
- 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。
与现代的数据结构类库的常见情况一样,Java集合类库也将接口(interface)与实现(implementation)分离。
比如队列(queue):队列接口指出可以在队列的尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数。当需要收集对象,并按照“先进先出”的规则检索对象时就应该使用队列。
队列接口的最简形式可能类似下面这样:
public interface Queue//a simlified form of the interface in the standard library { void add(E element); E remove(); int size(); }
这个接口并没有说明队列是如何实现的。队列通常有两种实现方式:一种是使用循环数组;另一种是使用链表。
每一个实现都可以通过一个实现了的Queue接口的类表示。
public class CircularArrayQueueimplements Queue //not an actual library class { private int head; private int tail; CircularArrayQueue(int capacity){...} public void add(E element){...} public E remove(){...} public int size(){...} private E[] elements; } public class linkedListQueue implements Queue //not actual library class { private link head; private link tail; linkedListQueue(){...} public void add(E element){...} public E remove(){...} public int size(){...} }
当在程序中使用队列时,一旦构建了集合就不需要知道究竟使用了哪种实现。因此,只有在构建集合对象时,使用具体的类才有意义。可以使用接口类型存放集合的引用。
QueueexpressLane=new CircularArrayQueue<>(100); expressLane.add(new Customer("Harry));
利用这种方法,一旦改变了想法,可以轻松地使用另外一种不同的实现。只需要对程序的一个地方做出修改,即调用构造器的地方。如果觉得linkedListQueue是个更好的选择,就将代码修改为:
Queue1.2 Collection接口expressLane=new linkedListQueue(); expressLane.add(new Customer("Harry"));
在Java库中,集合类的基本接口是Collection接口。这个接口有两个基本方法:
public interface Collection{ boolean add(E element); Iterator iterator(); ... }
- add方法用于向集合中添加元素。如果添加元素确实改变了集合就返回true,如果集合没有发生变化就返回false。例如,如果试图向集中添加一个对象,而这个对象在集中已经存在,这个添加请求就没有实效,因为集中不允许有重复的对象。
- iterator方法用于返回一个实现了Iterator接口的对象。可以使用这个迭代器对象依次访问集合中的元素。
Iterator接口包含4个方法:
public interface Iterator{ E next(); boolean hasNext(); void remove(); default void forEachRemaining(Consumer super E> action); }
通过反复调用next方法,可以逐个访问集合中的每个元素。但是,如果到达了集合的末尾,next方法将抛出一个NoSuchElementException。因此,需要在调用next之前调用hasNext方法。如果迭代器对象还有多个供访问的元素,这个方法就返回true。如果想要查看集合中的所有元素,就请求一个迭代器,并在hasNext返回true时反复地调用next方法。例如:
Collectionc=...; Iterator iter=c.iterator(); while(iter.hasNext()) { String element=iter.next(); //do something with element }
用“for each”循环可以更加简练地表示同样的循环操作:
for(String element:c)
{
//do something with element
}
for each循环可以与任何实现了Iterable接口的对象一起工作,这个接口只包含一个抽象方法:
public interface Iterable{ Iterable iterator(); ... }
Collection接口扩展了Iterable接口。因此,对于标准类库中的任何集合都可以使用for each循环。
JavaSE 8中,可以调用forEachRemaining方法并提供一个lambda表达式。将对迭代器的每一个元素调用这个lambda表达式,直到再没有元素为止。
iterator.forEachRemaining(element -> do something with element);
元素被访问的顺序取决于集合类。
2.具体的集合 3.映射 4.视图与包装器 5.算法 6.遗留的集合


