容器理解
目的:
如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序。通常,对象的数量只有在运行期才能确定,生命周期更是难于把握。
为解决这个问题,JAVA提供了容器类机制。容器的设计总是编程语言要解决的根本性问题。
基本概念:
容器类相当于集合,用来保存一组对象。基本类型包括List, Set, Queue和Map,要注意,这几个都是接口。
实现机制:
容器类图如下所示:
上图中,空心箭头的虚线表示一个类实现了某个接口,实心箭头的虚线表示某个类可以生成箭头所指向的类的对象。粗线框表示常用的容器类,实线表示普通类,虚线表示接口。
List:按序列保存对象的接口。
接口方法:增add()、删remove()、改set()、查indexOf() get()
ArrayList:底层基于数组的List接口的实现,长于随机访问,但是插入和删除较慢
LinkedList:底层基于链表的List接口的实现,长于插入和删除,但是随机访问较慢
Queue:一个先进先出 (FIFO) 的接口。
接口方法:增add() offer()、删remove() poll()、查改element() peek()
LinkedList:包装了LinkedList内部的某些方法。
PriorityQueue:底层基于堆实现的优先级队列,需要Comparator<T>接口定义对象间的比较规则。
Set:保存不重复对象的接口,离散数学中的集合。
接口方法:增add()、删remove()、改[通过查找更改引用的值]、查get()
TreeSet:底层基于红黑树实现基于比较的升序Set,同样通过Comparator接口。
HashSet:底层基于散列函数,实现元素对象的O(1)复杂度的查找。
LinkedHashSet:底层基于散列函数,并且用链表维护元素的插入顺序。
Map:保存由<键, 值>对组成的对象的集合,允许用键来查找值。Map可看作是由键、值两个Set和映射表构成。
接口方法:增put(K,V)、删remove()、改[通过查找更改引用的值]、查get()
特殊方法:keySet()方法返回包含键的Set对象
TreeMap:基于红黑树的Map接口的实现,实现按主键升序的<K,V>键值对保持。
HashMap:基于键的哈希表的Map接口的实现,实现元素对象的O(1)复杂度的查找。
LinkedHashMap:用链表维护<K,V>的插入顺序。
迭代器Iterator<E>接口:
目的:向上层系统封装底层容器的实现细节。例如,一个底层容器为List,随着业务的复杂,发现用Set更为合适,这样上层所有的调用细节都会发生改变。如果使用迭代器面向上层服务,则可扩展性更好。
接口方法:
hasNext():测试是否有下一个元素
next():游标移向下一个位置
remove():移除next()操作前的上一个位置的元素
一个类通过实现Iterable<T>接口获得Foreach调用的能力。