一、关系
Collection
–List:以特定顺序存储
–ArrayList、LinkList、Vector
–Set:不能包含重复的元素
–HashSet、TreeSet
–Map
–HashMap、HashTable、TreeMap
二、分别讲解
Collection:Collection是一个父接口,List和Set是继承自他的子接口,Collection是最基本的集合接口,Java SDK中不提供直接继承自Collection的类,而是提供继承自他子接口的类,如List和Set。所用的Collection类都支持一个Iterator()方法来遍历。
List:List接口是有序的,会精确的将元素插入到指定的位置,和下面的Set接口不同,List接口允许有相同元素
- ArrayList:实现可变大小的数组,允许所有的元素,不是同步的,也就是没有同步方法;
ArrayList是非同步的是线程不安全的 - LinkList:允许null元素,通常在首部或者尾部操作,所以常被使用做堆栈(stack)、队列(queue)和双向队列(deque)
- LinkedList基于双向链表实现,因此不像ArrayList需要扩容机制。
当ArrayList扩容时,会自动生成一个新的array(长度是之前的1.5倍),再将旧的array移值上去,不存在容量不足现象。
由于LinkedList实现了Deque,而Deque接口定义了在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。
LinkedList可以作为FIFO(先进先出)的队列或者LIFO(后进先出)的栈
LinkedList也是线程不安全的 - Vector:类似于ArrayList,但Vector是同步的,Stack继承自Vector;
vetor 与数组类似有一段连续的存储,拥有一段连续的内存空间,随机存取
自动分配工作空间节省空间,但是插入速度较慢,只能在尾部插入,在头部插入或者删除的时候消耗时间规模与容器的大小成正比当数组内存空间不够时,会重新申请一块内动空间并进行内存拷贝。进行整体的分配的拷贝与释放。
/*
* Vector数据存储
*/
public class vector {
public static void main(String[] args) {
Vector v=new Vector<>();
//void addElement(E obj) 将指定的组件添加到此向量的末尾,将其大小增加 1。
v.addElement("hello");
v.addElement("world");
v.addElement("java");
for(int x=0;x<v.size();x++){
//E elementAt(int index) 返回指定索引处的组件。
String s=(String) v.elementAt(x);
System.out.println(s);
}
}
}
Set:是一种不包含重复元素的Collection接口
- HashSet:不能有重复元素,底层是使用HashMap来实现的
Map:此接口实现的Key到Value的映射,一个Map中不能包含相同的Key,每个Key只能映射一个Value
- HashTable:实现了一个Key-Value的哈希表,每一个非null元素都可作为Key或者Value,HashTable是同步的
- HashMap:和HashTable的不同之处是,非同步的,且允许null元素的存在
三、Array和Arrays Collection和Collections
Array:是所以随机访问一串对象中,最有效率的一种,但是元素类型必须相同,且容量固定无法改变。
Arrays:此静态类专门操作array,提供搜索、排序、复制等静态方法
Collection:Java.util下的一个接口,是各种集合结构的父接口
Collections:Java.util下的一个专用静态类,他包含各种集合操作的静态方法,包括对集合的搜索、排序、线程安全等操作。
四、总结
涉及到堆栈、队列等操作,使用List接口,快速插入和删除应使用LinkList,随机访问元素使用ArrayList
== 单线程使用非同步类,多线程使用同步类 ==
注意对HashTable的操作,作为Key的对象要覆写equals和hashCode方法
在各种Map中HashMap用于快速查找
最长使用的是ArrayList、HashSet、HashMap、Array