前几天其实一直在学习关于linux的内容和kvm虚拟化的知识。今天有时间来回顾一下集合相关的知识,接下来我将带你们一块儿来回顾一块儿集合关联的知识。java
不要辜负本身花费时间作的事情,只有用心才能获得真心的回报!linux
关于java集合框架的知识:大体可分为Set、List和Map三种体系,其中Set表明无序、不可重复的集合;List表明有序、重复的集合;而Map则表明具备映射关系的集合。Java 5以后,增长了Queue体系集合,表明一种队列集合实现。数组
Java集合框架主要由Collection和Map两个根接口及其子接口、实现类组成。安全
集合类划分为两个大的部分:一种是能够按照必定顺序进行迭代访问的集合类;一种是通过名值对的映射创建关系进行访问的集合类数据结构
1.一、collection接口概述多线程
Collection接口是全部后续集合类型的一个公共抽象定义。它自己没有一个直接的实现,更多的是各类不一样的集合类型在它的基础上继承了更多特殊的特性并作了一个实现。并发
Collection接口里主要定义了一些做为集合类型比较通用的方法,好比说size, isEmpty, add, remove等。做为集合类型比较通用的一个定义,它主要用在一些须要比较高级别抽象的地方。好比说咱们须要能够对全部集合类型进行通用操做。 框架
1.二、Collection接口定义的方法性能
(1)增长、add(E e) - 返回值为boolean(是否添加成功)。
(2)清除、clear() - 除去此数组的全部操做。
(3)是否包含某一元素、contains(Object o) - 若是包含返回为true(能够用于进行if判断),若是集合里边的元素为自定义
类的话须要重写自定类的equals方法(contains方法就是基于equals实现的)不然比较的是地址。
(4)比较此collection与指定对象是否相等、equals(Object o) - 返回值为boolean(true为相等)。
(5)此collection是否包含某元素、isEmpty() - 返回值为boolean(true为不包含)。
(6)获取此collection的迭代器、iterator() - 用于遍历集合(此迭代器只能遍历集合,不能对集合进行修改,不然会报并发
修改异常-ConcurrentModificationException)。
(7)删除指定元素、remove(Object o) - 返回值为boolean(true表示删除成功)。
(8)返回元素数(集合的长度)、size() - 返回值为int(集合中元素的个数)。
(9)返回此集合中全部元素的数组、toArray() - 返回值是一个数组。
在经常使用的集合类型中,HashSet, TreeSet等具体的实现每每不同。好比说HashSet自己的实现是引用了HashMap做为内部的元素。若是咱们仔细检查他们的结构实现,会发现有的类型咱们也能够经过foreach的循环来遍历。学习
这是由于他们有的在实现Set定义接口的范围同时也继承了实现Collection接口的部分。能够说是二者兼有之。
在上面这些集合类型中,基于Hash表实现的主要有HashSet, LinkedHashSet。基于红黑树实现的有TreeSet.
特色:无顺序,不可重复
1)HashSet
不能保证元素的排列顺序,加入的元素要特别注意hashCode()方法的实现。
HashSet不是同步的,多线程访问同一步HashSet对象时,须要手工同步
集合元素值能够是null。
2)LinkedHashSet
LinkedHashSet类也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序。与HashSet相比,特色:
对集合迭代时,按增长顺序返回元素。
性能略低于HashSet,由于须要维护元素的插入顺序。但迭代访问元素时会有好性能,由于它采用链表维护内部顺序。
3)TreeSet
TreeSet类是SortedSet接口的实现类。由于须要排序,因此性能确定差于HashSet。
4)EnumSet类
专为枚举类设计的集合类,EnumSet中的全部元素都必须是指定枚举类型的枚举值
List类型的数据结构算是咱们平时接触最多并且看起来最简单的数据结构类型。最经常使用的两种是ArrayList和LinkedList,也就是咱们常说的线性表和链表。
1)LinkedList类
内部使用链表的形式来存储数据,在增长和删除数据上面性能更好
它实现了List接口和Deque接口,说明它具备两边接口的特性,所以它能够看成一个双端队列来用,也能够看成栈来用,而且它是以链表的形式来实现的,因此查询性能差,可是增长和删除操做性能高。
2)ArrayList类
内部使用数组来存储数据,也就至关于数据结构的顺序表存储,在查询数据上面性能好,
3)Vertor类
跟ArrayList相比,它是线程安全的,而ArrayList是线程不安全的,
4)Stack类继承Vertor类
看名字,其实就是方便模拟“栈”这种数据结构
用于模拟队列这种数据结构,而后该接口中声明了一些基本操做的方法。例如:add、offer、remove等
1)PriorityQueue类
PriorityQueue保存队列元素的顺序并非按照加入队列的顺序,而是按队列元素的大小从新排序
2)Deque接口
Deque表明一个双端队列,能够看成一个双端队列使用,也能够看成“栈”来使用,由于它包含出栈pop()与入栈push()方法。
3)ArrayDeque类为Deque的实现类
也就是实现了Deque接口中定义的方法,解释跟deque差很少
数组:是以一段连续内存保存数据的;随机访问是最快的,但不支持插入、删除、迭代等操做。
ArrayList与ArrayDeque:以数组实现;随机访问速度还行,插入、删除、迭代操做速度通常;线程不安全。
Vector:以数组实现;随机访问速度通常,插入、删除、迭代速度不太好;线程安全的。
LinkedList:以链表实现;随机访问速度不太好,插入、删除、迭代速度很是快。
Map接口:定义一些基本的操做,例如put(key,value), containKey(Object key)等一系列操做。
使用key、value键值对的形式进行访问的集合类
1)HashMap类和Hashtable类对比,
通常使用HashMap,由于Hashtable类是很古老的,据查都不建议用。日常咱们也是用HashMap
HashMap类是线程不安全的,而Hashtable是线程安全的
HashMap类可使用null做为key和value,而Hashtable不能够
2)Properties类继承Hashtable类
增长了额外的一些方法,例如:load(InputStream inStream)从属性文件加载key-value等方法。
能够将key-value用xml文件的格式保存,可能就是跟xml文件打一些交道
3)LinkedHashMap类继承HashMap类
LinkedHashMap从HashMap类继承而来。以链表来维护内部顺序。不少方面跟LinkedHashSet相似。LinkedHashMap它能够记住key-value对的添加时的顺序, 同时避免使用TreeMap时性能受到的影响。
4)SortedMap接口和TreeMap实现类
相似于SortedSet及TreeSet,TreeMap也能够自定义比较器(Comparable)实现定制排序。它的额外提供的方法也与TreeSet相似,增长了访问第一个、前一个、后一个、最后一个key-value对的方法,并
提供了从TreeMap中提取子集的方法。TreeMap不容许null做为key,要否则怎么比较呢?
5)IdentityHashMap类
与HashMap的不一样在于,只有两个key严格相等(key1 == key2)时,IdentityHashMap才认为两个key相等;而对于普通HashMap而言,只要key1.equals(key2)且hashCode相同便可。一样容许null值,不能保证顺序。
6)EnumMap类
EnumMap是一个与枚举类一块儿使用的Map实现。它的key必须是单个枚举类的枚举值。EnumMap不容许使用null做为key,但可做为value。
正常状况使用HashMap,而不是Hashtable。
若是考虑排序,那么考虑使用TreeMap。一般TreeMap比HashMap等在插入、删除操做时要慢很多,由于它须要在底层采用红黑树来管理key-value对。
若是考虑插入时的顺序,那么使用LinkedHashMap是个不错的选择。
若是想优化垃圾回收,建议使用WeakHashMap实现类(本文未说起);要求key彻底匹配(同一对象),则使用IdentityHashMap;还有枚举类很少说了。
关于null值:Hashtable不容许key为null,也不容许value为null;TreeMap与EnumMap不容许key为null;HashMap及其子类LinkedHashMap,IdentityHashMap容许key为null。