一,简介
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。
Collection是一个集合接口(集合类的一个顶级接口),它提供了对集合对象进行基本操作的通用接口方法。
Conllection主要方法:
boolean add(Object o) |
添加对象到集合。 |
boolean remove(Object o) |
删除指定的对象。 |
int size() |
返回当前集合中元素的数量。 |
boolean contains(Object o) |
查找集合中是否有指定的对象。 |
boolean isEmpty() |
判断集合是否为空。 |
Iterator iterator() |
返回一个迭代器。 |
boolean containsAll(Collection c) |
查找集合中是否有集合c中的元素。 |
boolean addAll(Collection c) |
将集合c中所有的元素添加给该集合。 |
void clear() |
删除集合中所有元素。 |
void removeAll(Collection c) |
从集合中删除c集合中也有的元素。 |
void retainAll(Collection c) |
从集合中删除集合c中不包含的元素。 |
Map是键值对映射的抽象接口。该映射不包括重复的键,一个键对应一个值。
Map主要方法:
void clear( ) |
从此映射中移除所有映射关系。 |
boolean containsKey(Object k) |
如果此映射包含指定键的映射关系,则返回 true。 |
boolean containsValue(Object v) |
如果此映射将一个或多个键映射到指定值,则返回 true。 |
boolean equals(Object obj) |
比较指定的对象与此映射是否相等。 |
Object get(Object k) |
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。 |
int hashCode( ) |
返回此映射的哈希码值。 |
boolean isEmpty( ) |
如果此映射未包含键-值映射关系,则返回 true。 |
Object put(Object k, Object v) |
将指定的值与此映射中的指定键关联(可选操作)。 |
void putAll(Map m) |
从指定映射中将所有映射关系复制到此映射中(可选操作)。 |
Object remove(Object k) |
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 |
int size( ) |
返回此映射中的键-值映射关系数。 |
二,Collection接口和子接口
1,Collection接口
Collection接口是List,Set和Queue接口的父接口,定义了可用于操作List,Set和Queue的方法。
2,List接口及其实现类
List的元素有序并且可以重复的集合,被称为序列。List可以精确的控制每个元素的插入位置,或删除某个元素。
2.1,ArrayList
ArrayList类底层由数组实现,允许对集合中的元素进行快速访问。但是向ArrayList插入或者删除的速度较慢(原因要移动元素)。
ArrayList集合允许所有的元素(包括NULL)。
2.2,LinkedList
LinkedList类底层采用链表结构保存元素。链表结构的优点是便于向集合中插入和删除元素(不需要移动任何元素),访问慢(原因每次访问都要遍历集合)。
LinkedList是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
2.3,Vector
Vector类底层由数组实现,支持线程同步,访问速度比ArrayList慢(原因线程同步)。
2.4,Stack
Stack是栈。它的特性是:先进后出。
Stack是继承于Vector的,由于Vector是通过数组实现的,所以Stack也是通过数组实现的。
3,Set接口及其实现类
Set的元素无序并且不可重复的集合,被称为集。
3.1,HashSet
HashSet是基于HashMap来实现的,底层采用HashMap来保存元素。采用 Hash 算法决定集合元素的存储位置(调用该元素的hashCode() 方法,获取哈希码值,然后根据这个哈希码值计算出该元素的存放位置),这样可以保证能快速插入和删除元素。
3.2 ,LinkedHashSet
LinkedHashSet类底层采用链表结构保存元素。链表结构的优点是便于向集合中插入和删除元素(不需要移动任何元素),访问慢(原因每次访问都要遍历集合)。
3.3,TreeSet
TreeSet是基于TreeMap实现的,TreeSet是一个有序的集合。
4,Queue接口以及实现类
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,在表的后端进行插入操作。
4.1,LinkedList
同上
4.2,PriorityQueue
PriorityQueue通过二叉小顶堆实现,不允许放入null元素。PriorityQueue又叫优先队列,优先队列的作用是能保证每次取出的元素都是队列中权值最小的。
4.3,BlockingQueue接口
BlockingQueue即阻塞队列,线程安全的。在某些情况下对阻塞队列的访问可能会造成阻塞(当队列满了的时候进行入队列操作,当队列空了的时候进行出队列操作)。
4.4,ConcurrentLinkedQueue
ConcurrentLinkedQueue即并发列队(并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率),也非阻塞队列,线程安全的。
三,Map接口和子类
Map提供了一种映射关系,其中的元素以键值对(key-value)的形式存储,能够实现根据key快速查找value。
Map中的键值对以Entry类型的对象实例存在。键(key)不可重复,值(value)可重复。多个键(key)可对应一个值,反之不行。
AbstractMap是个抽象类,它实现了Map接口中的大部分API。而HashMap,TreeMap,WeakHashMap都是继承于AbstractMap。
1,HashMap
HashMap基于哈希表实现,HashMap中的Entry对象是无序的。Key和value值都可以为null,但是key只能有一个null(key不可重复)。
1.1,LinkedHashMap
LinkedHashMap通过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序(有序)。该迭代顺序可以是插入顺序或者是访问顺序。
2,HashTable
和HashMap一样Hashtable也是基于哈希表实现,它存储的内容是键值对(key-value)映射。是线程安全的。它的key、value都不可以为null。
3,TreeMap
TreeMap基于红黑树实现的,是一个有序的key-value集合。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
四,Iterator接口
Iterator它是遍历集合的工具,即我们通常通过Iterator迭代器来遍历集合。我们说Collection依赖于Iterator,是因为Collection的实现类都要实现iterator()函数,返回一个Iterator对象。ListIterator是专门为遍历List而存在的。
五,Enumeration接口
Enumeration它是JDK 1.0引入的抽象类。作用和Iterator一样,也是遍历集合,但是Enumeration的功能要比Iterator少。Enumeration只能在Hashtable, Vector, Stack中使用。
六,Arrays、Collections工具类
Arrays类是一个实现对数组操作的工具类,包括了各种各样的静态方法,可以实现数组的排序和查找、数组的比较和对数组增加元素,数组的复制和将数组转换成字符串等功能。这些方法都有对所有基本类型的重载方法。
Collections是集合类的一个工具类,提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。此类不能实例化。
七,使用场景
1,List使用场景
如果涉及到"栈"、"队列"、"链表"等操作,应该考虑用List,具体的选择哪个List,根据下面的标准来取舍。
1,对于需要快速插入,删除元素,应该使用LinkedList。
2,对于需要快速随机访问元素,应该使用ArrayList。
3,对于单线程环境或者多线程环境,但List仅仅只会被单个线程操作,此时应该使用非同步的类(如ArrayList)。
4,对于多线程环境,且List可能同时被多个线程操作,此时,应该使用同步的类(如Vector)。
2,Map使用场景
1,HashMap是基于"拉链法"实现的散列表。一般用于单线程程序中。
2,Hashtable也是基于"拉链法"实现的散列表。它一般用于多线程程序中。
3,WeakHashMap也是基于"拉链法"实现的散列表,它一般也用于单线程程序中。相比HashMap,WeakHashMap中的键是"弱键",当"弱键"被GC回收时,它对应的键值对也会被从WeakHashMap中删除;而HashMap中的键是强键。
4,TreeMap 是有序的散列表,它是通过红黑树实现的。它一般用于单线程中存储有序的映射。