Java集合框架
Java集合框架基础介绍
我们都学习过基础的数据结构了,比如说数组、链表等。为什么还需要学集合框架呢?
这其中最重要的一点就是集合更加高级和灵活。除此之外集合还提供了一系列的方法供我们使用,比起我们单独使用数组或者链表要方便的多。
集合框架的组成介绍
从上面的图我们可以看出我们集合框架的最上面有三个接口,分别是Iterator、Collection、Map。(虚线空箭头表示:实现关系;实线空箭头表示:继承关系;实现黑箭头表示:依赖关系)
Iterator
由图可以看出来,Iterator接口可以被Collection接口使用,Collection接口又可以被Map接口使用(后面会做解释)。Iterator下有LinkIterator,List接口可以使用。
Iterator我们称为迭代器,我们可以不用去管集合的底层结构,对集合进行遍历的行为。迭代器是一种设计模式。
Collection
Collection接口中的子接口有List接口、Set接口、Queue接口和AbstractCollection接口。这里我们主要讲List接口、Set接口和Queue接口。
Collection接口中,我们主要存储的是相同类型的数据。我们主要从以下三个方面来分析:数据是否可以重复、数据是否有序(包括插入有序和访问有序)、是否可以存储NULL值。
List接口
List接口下常用的集合有ArrayList、LinkedList和Vector。
List接口可以存储重复的元素,存储的数据是有序的(此处为插入有序),并且可以存储NULL值。List接口下的集合,除了Vector以外,都是线程不安全的。
Set接口
set 接口下常用的集合有HashSet、LinkedHashSet、TreeSet。
Set接口下的集合是基于Map集合实现的。因此许多的特点与Map集合是十分相似的。
Set接口下的集合不可以存储重复的数据,存储的数据是无序的,可以仅仅存储一个NULL值。Set接口下的集合都是线程不安全的。
Queue接口
Queue接口下常用的集合有PriorityQueue(优先级队列)、BlockingQueue(阻塞队列)、DeQueue(双向队列)。
Queue接口下的集合可以存储重复的数据,存储的数据是有序(有序是基于数据特征)、不可以存储NULL值。
PriorityQueue是一个队列,但其获取最大值以及最小值时,其实现结构是平衡二叉树。
BlockingQueue也是一个队列,它用在最多的地方是多线程的处理。
Map接口
Map接口中的子接口有AbstractMap和SortedMap。但其实我们只需要讲AbstractMap就可以把Map中的集合说完。Map集合中常用的有:HashMap、LinkedHashMap、TreeMap、WeakHashMap、HashTable。
Map接口下,除了HashTable以外,其余的都是线程不安全的。
Map接口中,我们主要是以键值对(Key-Value)的形式进行数据的存储。Map接口下的集合我们同样用上面的三个方面来探讨。
HashMap
HashMap是AbstractMap抽象类的一个实现类之一。
HashMap不可以存储重复的数据、存储的数据是无序的、Key和value分别可以存储最多一个NULL值。
LinkedHashMap
LinkedHashMap继承自HashMap,实际上是优化了HashMap存储的数据无序的特点,底层是以链表的形式连接起来。
LinkedHashMap不可以存储重复的数据、存储的数据是有序的、Key和value分别可以存储最多一个NULL值。
TreeMap
TreeMap继承自SortedMap和AbstractMap。TreeMap可以通过实现实现比较器来进行自定义排序。
TreeMap不可以存储重复的数据,存储的数据是有序的(仅第一个元素是有序的:最大或最小的),不可以存储NULL值。
WeakHashMap
WeakHashMap是继承自AbstractMap。WeakHashMap同样也是HashMap,但其键值对中的Key是弱键,会在JVM(Java Virtual Machine)进行GC操作时,如果Key没有对象引用整个Entry实体就会被回收。
HashTable
HashTable继承自AbstractMap。
HashTable不可以存储重复的数据,存储的数据是无序的,并且不可以存储NULL值。
HashTable是线程安全的,但现在使用较少。建议学习java.util.concurrent包下的ConcurrentHashMap。详见OSChina在线文档。
工具类
除了以上集合以外,还提供了两个工具类:Collections和Arrays。
Collections
提供了一些方法供我们使用:例如排序、二分查找、复制等。详细见OSChina在线文档中java.util包下的Collections类。
Arrays
Arrays同样也是提供了许多已经写好的方法给我们使用。详细见Collection是链接中java.util包下的Arrays类。详细见OSChina在线文档。