11 持有对象
java容器的基本类型
- List
- Set
- Queue
- Map
11.2 基本概念
java容器类库的用途是保存对象,并将其划分为两个不同的概念
1. Collection 一个独立元素的序列,这些元素都服从一条或者多条规则
2. Map 键值对对象,允许使用键值来查找
11.5 List
有两种类型的List
- 基本的ArrayList,长于随机访问,但中间插入和移除元素较慢
- LinkedList,插入删除代价较低,提供了优化的顺序访问,但随机访问较慢
确定某个元素是否属于list会用到equals()方法
11.6 迭代器
迭代器是一个对象,它的作用是遍历并选择序列中的对象,而客户端程序员不必关心改序列的底层结构。
java的iterator只能单向移动,这个iterator只能用来
1. 使用iterator()方法返回一个Iterator
2. 使用next()方法获得序列的下一个元素
3. 使用hasNext()方法检查序列中是否还有元素
4. 使用remove()方法将迭代器最近返回的元素删除
迭代器统一了对容器的访问方式
11.6.1 ListIterator
ListIterator是一个更强大的Iterator的子类型,只能用于对各种List的访问,而且可以双向移动
可以调用listIterator()方法产生一个指向List开始的ListIterator,也可以调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator
11.7 LinkedList
LinkedList还添加了可以使其做Stack,Queue,和双端队列的方法
11.9 Set
Set具有与Collection完全一样的接口,因此没有额外的功能,实际上Set就是Collection,只是行为不同。
TreeSet将元素存储在红黑树 数据结构中,LinkedHashSet因为查询速度也使用了散列,但又使用列表来维护元素的插入顺序
11.10 Map
Map可以返回它的键的Set,它的值的Collection,或者它的键值对的Set
11.11 Queue
LinkedList实现的Queue接口,因此LinkedList可以作为Queue的一种实现。将LinkedList向上转型为Queue
- offer()方法将一个元素插入队尾
- peek()和element()方法将在不移除的情况下返回队头,peek在队尾为空时返回null,element抛出NoSuchElementException异常
- poll()和remove()方法移除并返回队头,但poll在队列为空时返回null,remove抛出异常
11.11.1 PriorityQueue
优先级队列声明下一个弹出的元素是最重要的元素,
当调用PriorityQueue可以确保当你调用peek(),poll(),remove()方法时,获取的元素是队列中优先级最高的元素
默认的排序是对象在队列中的自然排序,但可以通过提供自己的Comparator()方法来修改这个排序
Integer,String和Character已经内建了自然排序,如果想要在PriorityQueue中使用自己的类,就必须包含额外的功能以产生自然排序,或者提供自己的Comparator
11.12 Collection和Iterator
生成Iterator是将队列与消费者队列的方法连接在一起的耦合度最小的方式,实现Iterator接口只需要实现三个方法,hasNext(),next(),remove()
11.13 Foreach和迭代器
java SE5引入了新的Iterable接口,该接口包含一个能够产生Iterator的iterator()方法,并且Iterable接口被foreach用来在序列中移动。因此如果创建了任何实现了Iterable的类,都可以将它用于foreach语句中
11.14 总结
新程序不应该使用过时的Vector,Hashtable,和Stack
java.util中没有任何公共的Stack接口,因为在java 1.0中设计欠佳的java.util.Stack类占用了这个名字,使用LinkedList产生Stack应自己定义一个Stack
public class Stack<T>{
private LinkedList<T> storage = new LinkedList<T>();
public void push(T v){
storage.addFirst(v)
}
public T peek(){
return storage.getFirst();
}
public T pop(){
return storage.removeFirst();
}
public boolean empty(){
return storage.isEmpty();
}
public String toString(){
return storage.toString();
}
}
java容器简图
- 只有四种容器:Map,List,Set和Queue
- 点线框表示接口,实线框表示具体的类
- 空心箭头表示一个特定的类实线了某个接口
- 实心箭头表示某个类可以生成箭头指向的类的对象