容器
容器(Container)
如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序。但通常情况下,程序总是根据运行的情况去创建新的对象。在此之前,我们并不知道所需对象的数量,甚至不知道确切的类型。而我们要做的,是在任何时间任何位置创建任意数量的对象。
在Java中,为了解决这样的问题,提供了一套完整的容器:主要分为Collection和Map
参考文章:Java进阶-Collection集合
Collection
Collection是一个独立元素的序列,这些元素服从一条或者多条规则。可以简单分为:List(列表)、Set(集)、Queue(队列)、Collection(集合)
Collection类型家族分布如下:
其中,Collection是单列集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
JDK 不提供此接口的任何直接实现(抽象方法无法创建对象),它提供更具体的子接口(如Set和List)实现 。
List
①ArrayList:使用线性的数据结构(数组)实现,擅长随机访问元素,但是在其中插入和删除元素的的速度相对较慢。
②LinkedList:使用链表的数据结构实现,通过较低的代价就能完成元素的插入和删除,提供了优化的顺序访问。LinkedList在随机访问方面相对较慢。(可以提供栈、队列)
③Vector:同ArrayList,区别在于Vector是线程安全的,ArrayList是非线程安全的。
Set
HashSet(无序,唯一): 基于HashMap实现的,底层采用 HashMap 来保存元素。
LinkedHashSet:继承于 HashSet,并且其内部是通过 LinkedHashMap 来实现的。
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)
Map
Map又称为映射表,一组成对的“键值对”对象,即允许使用一个对象查找另一个对象,这种容器又被称为关联数组或字典,因为它将一些对象与另外一些对象关联起来。
Map类型家族分布如下:
HashMap: JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决哈希冲突)。JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。
LinkedHashMap: LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
Hashtable: 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的。
TreeMap: 红黑树(平衡二叉排序树) 。