集合的架构
Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中
Collection 接口存储一组不唯一,无序的对象
List 接口存储一组不唯一,有序(索引顺序)的对象
Set 接口存储一组唯一,无序的对象
Map接口存储一组键值对象,提供key到value的映射
List
- List
- 特点:有序 不唯一(可重复)
- ArrayList线性表中的线性表
- 在内存中分配连续的空间,实现了长度可变的数组
- 优点:遍历元素和随机访问元素的效率高
- 缺点:添加和删除元素效率低,,线程不安全
数组的长度是有限的而ArryList是无限长度的。底层实现,先创建一个10长度的数组,如果长度不够会对半扩容。
- LinkedList线性表中的双向链表
- 采用双向链表存储方式
- 缺点:遍历和随机访问效率低
- 优点:插入和删除元素效率比较高
- Vector
public void addFirst(E e) :将指定元素插入此列表的开头。
public void addLast(E e) :将指定元素添加到此列表的结尾。
public E getFirst() :返回此列表的第一个元素。
public E getLast() :返回此列表的后一个元素。
public E removeFirst() :移除并返回此列表的第一个元素。
public E removeLast() :移除并返回此列表的后一个元素。
public E pop() :从此列表所表示的堆栈处弹出一个元素。
public void push(E e) :将元素推入此列表所表示的堆栈。
public boolean isEmpty() :如果列表不包含元素,则返回true
Set
- Set
- 特点:无序 唯一(不重复)
- HashSet
- 采用Hashtable哈希表存储结构(神奇的结构)
- 优点:添加速度快 查询速度快 删除速度快
- 缺点:无序
- LinkedHashSet
- 采用哈希表存储结构,同时使用链表维护次序
- 有序(添加顺序)
- TreeSet
- 采用二叉树(红黑树)的存储结构
- 优点:有序 查询速度比List快(按照内容查询)
- 缺点:查询速度没有HashSet快
Map
- Map
- 特点 key-value映射
- HashMap
- Key无序 唯一 (Set)
- Value 无序 不唯一 (Collection)
面试常问:HashMap底层实现采用了哈希表,哈希表的基本结构就是“数组+链表”,即查询了查询速度又提高了删除增加速度
****★★★★HashMap储存键值对(put)底层原理过程
简单的简述一下:HashMap在存储每一个对象时,每个都会有自己的HashCode码,把HashCode码经过除数组的长度取余运算或者(HashCode码&数组长度)运算得到hash值,把该对象存到算出的hash值对应的数组中,如果下一个对象算出的hash值和上一个一样,会添加到上一个对象的后面,也是存在同一个数组位置。
****HashMap取出键值对(get(key))底层原理过程
简单讲述:HashMap取得过程和存储过程类似,get(key),当得到这个key值,经过hashCode运算得到hash值,带到hash值后会进一步找到所在数组的位置,然后在用equals方法查找链表中对应的对象,并返回。 JDK8中,如果链表的存储长度大于8时,就是使用红黑树存储。
★★★★LinkedHashMap*****
- 有序的HashMap 速度快
- 在HashMap中,有一个问题,就是 迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。HashMap的这一缺点往往会带来困扰,因为有些场景,我们期待一个有序的Map。
- 这个时候,LinkedHashMap就闪亮登场了,它虽然增加了时间和空间上的开销,但是 通过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序。该迭代顺序可以是插入顺序或者是访问顺序。
关注点 | 结论 |
---|---|
LinkedhashMap是否允许空 | key和Value都允许空 |
LinkedHashMap是否允许重复数据 | key重复会覆盖、Value允许重复 |
LinkedhashMap是否有序 | 有序 |
LinkedhashMap是否线程安全 | 非线程安全 |
LinkedHashMap可以认为是***HashMap+LinkedList***,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序。
第一张图为LinkedHashMap整体结构图,第二张图专门把循环双向链表抽取出来,直观一点,注意该循环双向链表的头部存放的是最久访问的节点或最先插入的节点,尾部为最近访问的或最近插入的节点,迭代器遍历方向是从链表的头部开始到链表尾部结束,在链表尾部有一个空的header节点,该节点不存放key-value内容,为LinkedHashMap类的成员属性,循环双向链表的入口。
- TreeMap
- 有序 速度没有hash快 默认递增排序
- 对于红黑二叉树只是了解阶段,先不做总结
迭代器Iterator
遍历集合的三种方式:
for循环,增强for,Iterator迭代器
Collections工具类
类java.utils.Collections提供了对Set、List、Map进行排序、填充、查找元素的辅助方法
- void sort(List)//对List容器内的元素排序,排序的规则是按照升序进行排序
- void shuffle(List)//对List容器内的元素进行随机排列。
- void reverse(List)//对List容器内的元素进行逆序排列
- void fill(List,Object)//用一个特定的对象重写整个List容器
- int binarySearch(List,Object)//对于顺序的List容器,采用则版查找的方法找特定对象