java类库中的集合接口和迭代器接口
集合有两个基本的接口:Collection和Map
java类库中,集合类的基本接口是Collection接口,迭代器接口是Iterator。
Collection主要包括两个方法:
public interface Collection
{
boolean add(E element);
Iterator iterator();
}
迭代器主要包括三个方法:
public interface Iterator
{
E next();
boolean hasNext();
void remove();
}
notes:java迭代器是位于两个元素之间。当调用next时候,迭代器就越过下一个元素,并返回刚刚越过的那个有元素的引用。
删除元素:
remove方法是删除上次调用next方法返回的元素。所以想要删除某个元素,首先应该越过这个元素。删除第一个元素的过程如下:
Iterator it = c.iterator();
it.next();//skip over the first element
it.remove();//now remove it
java 类库中的具体的集合
集合类型 | 描述 |
---|---|
ArrayList | 一种可以动态增长和缩减的索引序列 |
LinkedList | 一种可以在任何位置高效的删除和插入操作的有序序列 |
HashSet | 一种没有重复元素的无序集合 |
TreeSet | 一种有序集 |
ArrayDeque | 一种用循环数组实现的双端队列 |
PriorityQueue | 一种允许高效删除最小元素的集合 |
HashMap | 一种存储键/值关联的数据结构 |
TreeMap | 一种键值有序排列的映射表 |
链表LinkedList
java程序语言中所有的链表都是双向连接的(doubly linked)。
LinkedList.add 方法是将对象添加到链表尾部。如果要插入到其他位置就需要迭代器。也就是依赖于位置的add方法由迭代器负责。只有对自然有序的集合使用迭代器添加元素才有实际意义。例如集(Set)类型,其中的元素无序。在它的iterator接口中就没有add方法。但是,集合类库提供了子接口ListIterator,其中包含了add方法。
数组列表ArrayList
散列集HashSet
散列表是一种可以快速的查找所需要的对象的数据结构。在java中,散列表用链表数组实现(解决冲突的就是方法是链地址法)。每一个列表称为桶(bucket)。散列函数采用的而是除留余数法。填装因子(load factor)表示最大填装个数占容量的比例,决定了何时再散列。
树集TreeSet
数集是一个有序集合,任意顺序插入,但遍历时候自动有序排列。添加元素到树中比添加到散列表中慢,比添加到数组或链表中快。如果树种包含n个元素,查找元素的正确位置平均需要 logn次比较。
对象比较
对于TreeSet(以它为例)集合,要让TreeSet知道怎样对元素排序,也就是如何比较任意两个类型的大小。即自定义排序。有两种方法:
1.通过让要插入集合的中的类,实现Comparable接口。
2.在TreeSet构造器中提供Comparator对象。
例如,String 类继承了comparable接口,实现了comparaTo方法(依据字典序决定字符串大小)。
队列Queue
双端队列Deque
优先级队列(priority queue)
一种允许高效删除最小元素的集合。就是任意顺序插入,却总是按照排序的顺序索引。它并没有对元素排序,而是使用一个优雅又高效的数据结构——堆(heap)。
映射表(Map)
知道键的信息,需要查找对应的元素。map就是为此设计的。映射表有两个通用的实现:HashMap和TreeMap
散列映射表对键进行散列
树映射表用键对元素排序
键必须是唯一的,如果对同一个键两次调用put方法,第二个值就会取代第一个值,并放回这个键的上一个值。
映射表的三个视图:键集、值集合和键/值对集。
Set<K> keySet()
Collection<V> values()
Set<Map.entry<K,V>> entrySet()