结构图:
一、概念
Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:
(1) Collection 。 一组对立的元素,通常这些元素都服从某种规则。List必须保持元素特定的顺序,而Set 不能有重复元素。
(2) Map 。 一组 成对的“键值对”对象。
初看起来这似乎应该是一个Collection ,其元素是成对的对象,但是这样的设计实现起来太笨拙了,于是我们将Map明确的提取出来形成一个独立的概念。另一方面,如果使用Collection 表示Map的部分内容,会便于查看此部分内容。因此Map一样容易扩展成多维Map ,无需增加新的概念,只要让Map中的键值对的每个“值”也是一个Map即可。
1、集合框架底层数据结构
1、Collection
(1)List(List必须保持元素特定的顺序)
● Arraylist: Object数组
● Vector: Object数组
● LinkedList: 双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环)
(2) Set(Set 不能有重复元素)
● HashSet(⽆序,唯⼀): 基于 HashMap 实现的,底层采⽤ HashMap 来保存元素
● LinkedHashSet: LinkedHashSet 继承于 HashSet,并且其内部是通过LinkedHashMap 来实现的。
有点类似于我们之前说的LinkedHashMap 其内部是基于 HashMap 实现⼀样,不过还是有⼀点点区别的
● TreeSet(有序,唯⼀): 红⿊树(⾃平衡的排序⼆叉树)
2、Map
● HashMap: JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突⽽存在的(“拉链法”解决冲突)。
JDK1.8以后在解决哈希冲突时有了较⼤的变化,当链表⻓度⼤于阈值(默认为8)时,将链表转化为红⿊树,以减少搜索时间
● LinkedHashMap: LinkedHashMap 继承⾃ HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红⿊树组成。
另外,LinkedHashMap 在上⾯结构的基础上,增加了⼀条双向链表,使得上⾯的结构可以保持键值对的插⼊顺序。同时通过对链表进⾏相应的操作,实现了访问顺序相关逻辑。
详细可以查看:LinkedHashMap 源码详细分析(JDK1.8)_慕课手记
● Hashtable: 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突⽽存在的
● TreeMap: 红⿊树(⾃平衡的排序⼆叉树)
二、如何选用集合
主要根据集合的特点来选⽤。
⽐如我们需要根据键值获取到元素值时就选⽤Map接⼝下的集合,需要排序时选择TreeMap,不需要排序时就选择HashMap,需要保证线程安全就选用ConcurrentHashMap。
当我们只需要存放元素值时,就选择实现Collection接⼝的集合,需要保证元素唯⼀时选择实现Set接⼝的集合⽐如TreeSet或HashSet,不需要就选择实现List接⼝的⽐如ArrayList或LinkedList,然后再根据实现这些接⼝的集合的特点来选⽤。