基本概念
Java容器类类库的用途是“保存对象”
1)Collection。一个独立元素的序列,这些元素都服从一条或者多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)
2)Map。一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在一起。映射表允许我们使用另一个对象来查找某个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在一起,或者被称为“字典”
List <Apple> apples = new ArrayList<Apple>();
注意:List是接口,不能直接创建其对象new List(),使用接口的目的在于如果你决定去修改你的实现,你所需要的只是在创建出修改它。
List <Apple> apples = new LinkedList<Apple>();
ArrayList和LinkedList都是List类型,从输出看,它们都按照被插入的顺序保存元素。
HashSet、TreeSet、LinkedHashSet都是Set类型,输出显示在Set中,每个相同的项只有保存一次,但是输出也显示了不同的Set实现存储元素方式也不同。HashSet是最快的获取元素方式。TreeSet保存存储顺序,按照比较结果的升序保存对象。LinkedHashSet按照被添加的顺序保存对象。
List
List可以将元素维护在特定的序列中。List接口在Collection的基础上添加了大量的方法,使得可以在List中间插入和移除元素。
有两种类型List:
1)ArrayList,常于随机访问元素,但是在List中间插入和移除元素时较慢。
2)LinkedList,通过代价较低的在List中间进行的插入和删除操作,提供了优化的顺序访问。LinkedList在随机访问方面相对较慢,但是特性集更大。
迭代器
迭代器通常被称为轻量级对象:创建它的代价小
1)使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
2)使用next()获得序列中下一个元素
3)使用hasNext检查序列中的下一个元素
4)使用remove()将迭代器新近返回的元素删除
Iterator<String> it = list.iterator(); while(it.hasNext()) { it.next(); it.remove(); }
能够将遍历序列的操作与序列底层的结构分离,直接用next()访问任意容器中的元素。
ListIterator只能用于各种List类访问,可以双向移动,还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素。可以通过listIterator()方法产生一个指向List开始处的ListIterator,并且还可以通过调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。
ListIterator<String> it = list.listIterator(); while(it.hasNext()) { System.out.println(it.next() + ", " +it.nextIndex() + ", " + it.previousIndex()); }
LinkedList
LinkedList执行某些操作(在List中间插入和移除)时比ArrayList更高效,但在随机访问操作方面要逊色。还添加了可以使其用作栈、队列或双端队列的方法。
Stack
“栈”通常是指“后进先出”(LIFO)。有时栈也被称为叠加栈,因为最后“压入”栈的元素,第一个“弹出”栈。LinkedList具有能够直接实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用。
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(); } }
11.9 Set
Set不保存重复的元素。Set最常被使用的是测试贵属性,你可以容易地询问某个对象是否在某个Set中。正因为如此,查找就成了Set的最重要的操作。
HashSet所维护的顺序与TreeSet或LinkedHashSet都不同,因为它们实现具有不同的元素存储方式。TreeSet将元素存储在红-黑树数据结构中,而HashSet使用的是散列函数。LinkedHashList因为查询速度的原因也使用了散列,但是看起来使用了链表来维护元素的插入顺序。如果想对结果排序,可以使用TreeSet代替HashSet。
Set<String> words = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);//增加排序条件
11.10 Map
Map<K, V>将对象映射到其他对象,也可以将二维扩展到多维。Map<K, List<>>
11.11 Queue
队列是一个先进先出(FIFO)的容器。即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序与取出顺序是相同的。队列常被当作一种可靠的将对象从程序的某个区域传输到另一个区域的途径。
LinkedList提供了方法以支持队列的行为,并且它实现了Queue接口,因此LinkedList可以用作Queue的一种实现。
PriorityQueue
先进先出描述了最典型的队列规则。队列规则是指在给定一组队列的元素的情况下,确定下一个弹出队列的元素的规则。先进先出声明的是下一个元素应该等待时间最长的元素。
优先级队列声明下一个弹出元素是最需要的元素