java集合相关

集合类存放于java.util包中

首先需要说的是Collection

Collection是集合的基本接口,List、Set、Queue就继承于Collection接口(Map没有)。

java的集合主要有三种:Set,List和Map

先说Collection系的三个:Set,List与Queue,这里列出他们的常用接口及其实现类

Set(集)

  Set具有与Collection完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素(至于如何判断元素相同则较为负责),存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。

  SortedSet : 是继承了Set的一个借口,顾名思义是有序的Set,实现类基本只有TreeSet,其中的有序指的是元素中大小的顺序而并不是插入时的顺序。

  TreeSet : SortedSet的实现类,保存次序的Set, 底层基于TreeMap,TreeMap为红黑树结构。使用它可以从Set中提取有序的序列。  

  HashSet : Set的实现类之一,为快速查找设计的Set。底层基于HashMap,存入HashSet的对象必须定义hashCode()。HashSet查找某个对象时,首先用hashCode()方法计算出这个对象的Hash码,然后再根据Hash码到相应的存储区域用equals()方法查找,从而提高了效率。

  LinkedHashSet : HashSet的子类,具有HashSet的查询速度,且内部使用链表来维护元素的顺序(这里的顺序指的是插入时的顺序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

List(列表)

  List最重要的特点就是次序,它保证维护元素特定的顺序,即list中元素是有序的。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用,因为其是链表的存储结构)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。Java List一共三个实现类:分别是ArrayList、Vector和LinkedList。
  ArrayList : 由数组实现的List(顺序存储,即在存储空间内开辟一块连续的空间用于存储,值得一提的是如果存储空间满了则会自动增加50%+1的空间)。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢(由于顺序存储的缘故,如果假设有10个元素,需要删掉其中的第2个,则3,4,5...一直到第10个元素的位置都需要往前移动,插入同理)。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。
  Vector : 也是由数组实现的List,大体上与ArrayList无异,Vector的主要优点即线程安全,一个Vector中同一时间只能有一个线程对它进行写操作,但是由于线程的同步需要消耗一定资源,所以速度上自然比不上ArrayList。

  Stack : Vector的一个子类,基于动态数组实现的一个线程安全的栈。当然由于Vector的线程安全的效率值得商榷,Stack的效率也并不高。

  LinkedList : ListDeque接口的实现类,链表存储结构,向List中间插入与删除的开销并不大(因为本身的存储空间并不连续,元素和下一个元素之间都是通过指针来连接)。随机访问则相对较慢(因为访问时需要移动指针,而ArrayList则直接访问某一固定位置即可),还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。

Queue(队列)

  Queue与Set,List同级,均继承了Collection接口,它定义了一个基本的Queue应该有哪些功能以及约束。

  PriorityQueue : 即优先队列,通过二叉小顶堆实现,可以用一棵完全二叉树表示,优先队列的作用是能保证每次取出的元素都是队列中权值最小的,其中权值是由元素本身的自然顺序(natural ordering),或是通过构造时传入的比较器(Comparator)来决定。

  Deque : 继承自Queue,Deque是双向队列,Queue遵循先进先出,但Deque头尾均可进出。

  ArrayDeque : Deque的一个实现类,当用作堆栈时,此类可能会比Stack快,并且当用作队列时速度高于LinkedList,造成这种情况其实也非常好理解,Stack继承自Vector,其所有操作均遵照线程安全的方式进行,消耗的资源会比不线程安全的Deque要大,而LinkedList是链表结构,在头尾插入删除操作的速度又不如顺序存储结构的Array系(当然,LinkedList的优点是中间元素的相应增删操作,但是队列怎么可能允许做这类操作)。

Map(映射)

  Map与Collection在集合框架中属并列存在(即前文提到的继承Collection的不包括Map)。

  Map存储的是键值对,而之前的List和Set存储的只是值,当然,也可以说他们在集合中的序号看做他们的键,不过本质上是不同的。Map存储元素使用put方法,Collection使用add方法,Map集合取出元素时先转成Set集合,再通过迭代获取元素,于Collection也有不同。另外由于Map集合中使用键值对进行储存,所以键必须是唯一的,即任意两个键不能相同,但是值可以是相同的,即任意两个不同键对应的值可以相同。Map

  这里要先提一下Hash表的概念了:Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找

  Hashtable : 底层是哈希表数据结构,线程是同步的(即线程安全),不可以存入null键,null值。效率较低,被HashMap 替代。

  HashMap : 底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。要保证键的唯一性,需要覆盖hashCode方法,和equals方法。

  LinkedHashMap : 该子类基于哈希表又融入了链表,提高插入和删除元素的效率,当然访问时效率应该也会有所下降。

  TreeMap : 底层是二叉树数据结构。可以对map集合中的键进行排序。需要使用Comparable或者Comparator进行比较排序,当然也可以定义他们实现特殊的排序方法。 

参考博文:

Java深入 - 深入理解Java集合

Java中Set的使用

Java Map集合的详解

posted @ 2017-09-08 15:44  Qunter  阅读(255)  评论(0编辑  收藏  举报