如图,Java集合框架如上所示,虚线框为接口,实线框为派生类。引入集合的原因是数组(Array)只能是固定大小的,在声明时必须说明其大小,并且一次分配,不能动态增长。Collection的派生接口大致分为 Map(键值对)\List(允许存在重复元素)\Set(不允许存在重复元素)\Queue等。(具体参见上面这个简单的图和Java
API)
List接口:
定义List的两大用处:
1)maintain elements in a particular sequence
2)allow insertion and removal of elements in the middle of the List
(注:可以把List理解为我们数据结构中所学的“线性表”,线性表根据其实现方式可以分为 顺序表 和 线性链表)
ArrayList类:an array that can automatically expands itself, 有定义可以看出其与数组之间的区别——可以动态增长。常用 get() 获取元素,add() 增加元素, size() 查询该集合的长度(所含元素的个数),可以通过泛型来约束其内部所含元素的类型,不至于程序将橘子加入了苹果队列中。如
ArrayList<Apple> 其中Apple为预先定义好的类。(特点:随机存取,但增删元素速度慢)
这里元素的遍历可以根据索引来get()元素,亦可通过 foreach 来直接遍历元素。
LinkedList类:理解为线性链表,特点是增删元素快,但存取速度慢
1) more efficient than ArrayList in insertion and removal
2) allow it to be used as a Stack, a Queue, or a double-ended queue (这也是为什么引入 LinkedList 类的原因)
常用的方法有:remove() \ indexOf() \ equals() \ toArray() (将集合转为数组)
此外它有一些特殊的方法(引入这些方法的原因是LinkedList常被用来当作栈、队列、双端队列)
getFirst() == element() ,返回集合的第一个元素,若集合为空,则报异常
peek() 获取并返回第一个元素,若为空,则返回null
removeFirst() == remove() 移除(弹出)并返回集合的第一个元素,若为空,则报异常
poll() 获取并移除集合的第一个元素,若为空,则返回null
addFirst() 在头部追加元素
offer() == add() == addLast() 在尾部追加元素
(这里列出这些方法的目的是为了比较部分方法之间的相似性,因为LinkedList可以被用在多种状况下,根据需要,可以根据API来选择不同的方法)
Set接口:
特点是:Set cannot have duplicate elements (不允许存在重复元素),设计 Set 的最重要原则是方便检索。
HashSet:采用 harshing 算法,因此检索效率高 (之于Set的一般用途,HashSet是最常被实现的类)
TreeSet:采用 红黑树 数据结构,因此无论插入顺序如何,集合最终按照字典顺序输出
LinkedHashSet:顾名思义,使用 harshing 算法提高检索效率,同时元素按照插入顺序排序
这里提两个方法:contains() 方法常被用来检测是否含有某个元素,isEmpty方法常被用来测试集合是否为空
Map接口:
引入 Map 的目的是为了使用另一种方法检索元素,即为每一个Value对应一个唯一的Key,这样可以用Key来检索集合。通过put(key,value)来添加元素,通过get(key)来检索元素。三个子类与
Set 的子类很像,如下:
HashMap
TreeMap
LinkedHashMap
特有内部接口:
Map.Entry<K,V> 内部接口,表示一组映射关系
这里值得说明几个Map特有的方法:
entrySet() 返回的是 Map里的所有映射关系(即Map.Entry),例如
Set entrys = map.entrySet(); for(Object o:entrys){ System.out.println(o) }
将返回一行一行的 key=value 关系对
keySet() 返回的是 Map里所有key的集合
values() 返回的是 Map里所有value的集合
Iterator接口:
使用方法:
1) ask a collection hand you an Iterator using: iterator()
2) get the next object using: next()
3) see if there are any more obejcts: hasNext()
4) remove the last element returned by iterator with: remove()
e.g
List<Pet> pets = Pets.arrayList(12); Iterator<Pet> it = pets.iterator(); while(it.hasNext()){ System.out.println(it.next() + ","); }
ListIterator接口:
特点:可双向遍历
方法:
set(): replace the last element that it visited
listIterator() : the same as iterator()
listIterator(n) : 迭代器的初始指向 index 为 n 的元素
previous() & hasPrevious() :向前迭代