1,集合框架

一,简介

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 是有序的散列表,它是通过红黑树实现的。它一般用于单线程中存储有序的映射。

原文地址:https://www.cnblogs.com/Zender/p/8119166.html