数组长度是固定的,没法动态改变;集合容量是动态改变的;数组
数组能存储基本数据类型;集合只能存储对象;安全
数组在定义时须要指定容量,所以length只能获取到数组的容量,并不能判断数组中存储了多少元素;
集合的size()能够准确判断集合中存储了多少元素;框架
Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),所以Java集合大体也可分红List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)。线程
有序可重复集合,可直接根据元素的索引来访问。List集合默认按照元素的添加顺序设置元素的索引,能够经过索引(相似数组的下标)来访问指定位置的集合元素。
实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。指针
底层经过数组实现,初始容量为10,在每次向容器中增长元素的同时都会进行容量检查,当快溢出时,就会进行扩容操做;
查询快,增删慢,轻量级;
线程不安全。对象
底层是一种双向循环链表。在此链表上每个数据节点都由三部分组成:前指针(指向前面的节点的位置),数据,后指针(指向后面的节点的位置);
最后一个节点的后指针指向第一个节点的前指针,造成一个循环。
查询效率低、增删效率高;
它具备方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()等。blog
队列(Queue)是限定全部的插入只能在表的一端进行,而全部的删除都在表的另外一端进行的线性表。
表中容许插入的一端称为队尾(Rear),容许删除的一端称为队头(Front)。
队列的操做是按先进先出(FIFO)的原则进行的。
队列的物理存储能够用顺序存储结构,也能够用链式存储结构。排序
栈(Stack)也是一种特殊的线性表,是一种后进先出(LIFO)的结构。
栈是限定仅在表尾进行插入和删除运算的线性表,表尾称为栈顶(top),表头称为栈底(bottom)。
栈的物理存储能够用顺序存储结构,也能够用链式存储结构。索引
Vector与ArrayList相似,可是是线程安全的。接口
无序不可重复集合,只能根据元素自己来访问;
容许存放null;
HashSet底层经过HashMap实现,只不过生成一个HashSet的话,系统只提供key的访问; 若是有两个Key重复,那么会覆盖以前的;
非线程安全。
LinkedHashSet是HashSet的一个子类,它用一个链表来维护元素的插入顺序,插入的时候即要计算hashCode又要维护链表,而遍历的时候只须要按链表来访问元素。
TreeSet实现了SortedSet接口,顾名思义这是一种排序的Set集合;
TreeSet是依靠TreeMap来实现的;
TreeSet提供了一些额外的按排序位置访问元素的方法,例如first(), last(), lower(), higher(), subSet(), headSet(), tailSet();
TreeSet的排序分两种类型,一种是天然排序,另外一种是定制排序。
存储key-value对的集合,可根据元素的key来访问value;
key惟一;