Java Collections Framework是Java提供的对集合进行定义,操做,和管理的包含一组接口,类的体系结构。java
Java集合框架的基本接口/类层次结构:算法
java.util.Collection [I]
+--java.util.List [I]
+--java.util.ArrayList [C]
+--java.util.LinkedList [C]
+--java.util.Vector [C]
+--java.util.Stack [C]
+--java.util.Set [I]
+--java.util.HashSet [C]
+--java.util.SortedSet [I]
+--java.util.TreeSet [C]数组
java.util.Map [I]
+--java.util.SortedMap [I]
+--java.util.TreeMap [C]
+--java.util.Hashtable [C]
+--java.util.HashMap [C]
+--java.util.LinkedHashMap [C]
+--java.util.WeakHashMap [C]安全
[I]:接口数据结构
[C]:类框架
从上图能够看出:性能
List和Set 都是继承于Collection借口,而Map 没有继承Collection接口。也就是说Map和Collection是2种不一样的集合。spa
Collection能够看做是(value)的集合,而Map能够看做是(key,value)的集合。.net
Map接口由Map的内容提供3种类型的集合视图,一组key集合,一组value集合,或者一组key-value映射关系的集合。线程
因此,java集合的主要分为三种类型:
Set(集)
List(列表)
Map(映射)
要深刻理解集合首先要了解下咱们熟悉的数组:
数组是大小固定的,而且同一个数组只能存放类型同样的数据(基本类型/引用类型),而JAVA集合能够存储和操做数目不固定的一组数据。 全部的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。
简单说下集合和数组的区别:(参考文章:《Thinking In Algorithm》03.数据结构之数组)
有人想有能够自动扩展的数组,因此有了List
有的人想有没有重复的数组,因此有了set
有人想有自动排序的组数,因此有了TreeSet,TreeList,Tree**
而几乎有有的集合都是基于数组来实现的.
由于集合是对数组作的封装,因此,数组永远比任何一个集合要快
但任何一个集合,比数组提供的功能要多
一:数组声明了它容纳的元素的类型,而集合不声明。这是因为集合以object形式来存储它们的元素。
二:一个数组实例具备固定的大小,不能伸缩。集合则可根据须要动态改变大小。
三:数组是一种可读/可写数据结构---没有办法建立一个只读数组。然而可使用集合提供的ReadOnly方法,
以只读方式来使用集合。该方法将返回一个集合的只读版本。
List : 是有序的,容许重复的集合,因此,有add(object )方法和add(int index,Object o)的方法。一个对象能够反复存储到list集合中,每调用一次add方法,对象就被插入一次,(集合中用一个索引变量指向该对象)。可使用Iterator遍历list中的全部对象,也可使用get(index i)来获取。
ArrayList ,Vector, LinkedList的区别:
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,都容许直接序号索引元素,可是插入数据要设计到数组元素移动等内存操做,因此索引数据快插入数据慢,Vector因为使用了synchronized方法(线程安全)因此性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据须要进行向前或向后遍历,可是插入数据时只须要记录本项的先后项便可,因此插入数度较快!
ArrayList 和 Vector的区别:
1.同步性:Vector是线程安全的,而ArrayList和LinkedList是线程不安全的
2.数据增加:Vector增加原来的1倍,而ArrayList增长原来的0.5倍
ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来能够描述以下:
1.对ArrayList和LinkedList而言,在列表末尾增长一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增长一项,指向所添加的元素,偶尔可能会致使对数组从新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不支持高效的随机元素访问。
4.ArrayList的空间浪费主要体如今在list列表的结尾预留必定的容量空间,而LinkedList的空间花费则体如今它的每个元素都须要消耗至关的空间
Set:多个对象之间没有明显的顺序不容许重复元素。因此add方法有一个Boolean的返回值,若是集合中含有与某个元素equals相等的元素时返回false,不然放回true。同时没有办法获取第几个元素,只能使用Iterator接口获取全部的元素,再逐一遍历各个元素。
HashSet按Hash算法来存储集合的元素,所以具备很好的存取和查找性能
HashSet的特色:
(1)HashSet不是同步的,多个线程访问是须要经过代码保证同步
(2)集合元素值可使null。
HashSet集合判断两个元素相等的标准是两个对象经过equals方法比较相等,而且两个对象的hashCode()方法返回值也相等。
hash算法的功能:
它能保证经过一个对象快速查找到另外一个对象。hash算法的价值在于速度,它能够保证查询获得快速执行。
当须要查询集合中某个元素时,hash算法能够直接根据该元素的值获得该元素保存位置,从而可让程序快速找到该元素。
TressSet : 能够对Set集合中的元素进行排序。
底层数据结构是二叉树,保证元素惟一性。
TreeSet排序的第一中方式:让元素自身具有比较性
元素须要实现Complare
删除clear()和remove(Object key),判断containsValue(Object value)和containsKey(Object key)
|--Hashtable:底层是哈希表数据结构,不能够存入null键null值,该集合是线程同步的。jdk1.0效率低
|--HashMap:底层是哈希表数据结构,容许使用null值和null键,该集合是不一样步的。jdk1.2效率高
|--TreeMap:底层是二叉树数据结构。线程不一样步,能够用于给map集合中的键进行排序。
和Set很像。Set底层就是使用了Map集合。