Java的集合框架分为两个系列,Collection和Map系列。在大学期间,学习数据结构时,好像学习了线性表、非线性表、树,哎,都给忘了。其实,在Collection系列内部又可以分为线性表、集合两大类。
常用的线性表有:ArrayList、LinkedList、Vector、Stack、Queue。
其中Stack、Queue是特殊的线性表。他们的特殊性表现在:
Stack是先进后出,FILO,也叫后进先出:LIFO。
Queue是先进先出,FIFO。
Collection系列中还有Set集。他们的实现比较复杂。后续将说明。
另外一个系列是Map,Dictionary为代表的<Key, Value>集合,具体如何实现,将在后续说明。
ArrayList
正如它的名字一样,JDK中确实是使用数组实现的。elementData就是。
另外,这个类中也提供了直接转为数组的方法:
数组的特征是可以快速查询,但是插入、删除操作不方便。
LinkedList
看到这个名字,你可能会想到他是个单链表。如果这样想,只能说是对了一半。它确实是个链表,但不是一个单链表,而是一个双向链表。
下面看看源码:
看看这个Entry<K>到底是个什么玩意:
如果是单链表,有next就可以了,而不需要有previous。
双向链表的特征是:查找不方便,增删方便。
Vector
Vector汉语意思是向量,从名字上就可以知道是一个可变的集合。它是一个可变数组。
它和ArrayList都采用数组实现,但是他俩个有明显的区别,而这个问题也是面试时常会考到的问题。
Stack
Stack,后进先出,也就是说每次取数,都是取出最后一个。
这个特性实现起来一点也不难,使用数组就可以实现了。接下来看看JDK中是如何实现的:
JDK中也是使用数组的。
Queue
这是一个接口,在并发编程中使用很多。下面列出了Queue的实现类: